我有一个 bash 脚本,它应该运行另一个名为文件选择器的程序。
#!/bin/bash
...
./file-selector -exclude="a/b/c/d/e/f1,a/b/c/d/e/f2,a/b/c/d/e/f3,a/b/c/d/e/f4,a/b/c/d/e/f5,a/b/c/d/e/f6"
...
我想将文件选择器行更改为如下所示:
./file-selector -exclude="a/b/c/d/e/f1,\
a/b/c/d/e/f2,\
a/b/c/d/e/f3,\
a/b/c/d/e/f4,\
a/b/c/d/e/f5,\
a/b/c/d/e/f6"
该-exclude
选项需要一个以逗号分隔的路径列表。
但是文件选择器程序正在退出并出现错误,可能是因为它遇到了所有空格和换行符。
有没有更好的方法来编写这个表达式以相当于 1-liner ?
为了避免出现空格,请勿在每行末尾添加空格或制表符(反斜杠后面的空格除外),连续行的开头也是如此:
像这样 :
将不带分隔符的值存储在数组中。使用扩展为单个单词的事实,
"${array[*]}"
该单词包含连接的数组的所有成员,其间的第一个字符$IFS
。对于你想做的事,你需要
IFS=,
。更改
IFS
可能会影响脚本中稍后的命令,包括获取相关参数的命令(./file-selector
在您的情况下)。为了避免这种情况,请仅使用更改后的 IFS 将数组重写为非数组变量;接下来恢复旧值IFS
,然后运行实际命令。保存和恢复
IFS
有其怪癖:空并不等于未设置(尽管"$IFS"
在两种情况下都会扩展为空字符串)。当 Bash(至少我测试过的 Bash 5.2.15)IFS
开始解释脚本时,它仍然设置为 <space><tab><newline> ,因此IFS
脚本中的首字母肯定既不是空的也不是未设置的。这意味着可以安全地存储和恢复它。硬编码IFS=$' \t\n'
以恢复默认值也可以。概念证明:
输出是:
这意味着论证完全如你所愿。
整个片段的可读性不是很好(特别是对于那些不知道这个技巧的人来说),但是路径列表非常清晰(而且也是描述性的,因为数组有一个有意义的名称)。
请注意,将 a
path/with spaces or so
存储在数组中时需要加引号或转义。例子: