脚本捕获一系列逗号分隔的参数,我想知道它是如何工作的。为什么在subshell调用中加密之后有3个斜杠:
for cryptopt in ${cryptoptions//,/ }; do
这个语法对应的是什么?
脚本捕获一系列逗号分隔的参数,我想知道它是如何工作的。为什么在subshell调用中加密之后有3个斜杠:
for cryptopt in ${cryptoptions//,/ }; do
这个语法对应的是什么?
这不是一个“sed像变量调用bash”, 它根本没有与sed。
从man bash
,在模式替换部分:
${parameter/pattern/string} Pattern substitution. The pattern is expanded to produce a pat- tern just as in pathname expansion. Parameter is expanded and the longest match of pattern against its value is replaced with string. If pattern begins with /, all matches of pattern are replaced with string. Normally only the first match is replaced.
换句话说:
${cryptoptions/,/ }
:与空间${cryptoptions//,/ }
替换第一,
: replac e每,
用一个空格而你所拥有的for cryptopt in words; do ...; done
是一个循环。 对于words
中的每个单词,它将执行循环体,代码为do
和done
。
试试这个:
cryptoptions=foo,bar,baz
for cryptopt in ${cryptoptions//,/ }; do
echo $cryptopt
done
它有效地对应于:
for cryptopt in $(echo "$cryptoptions" | sed 's/,/ /g'); do
echo $cryptopt
done
和利用的事实,不带引号的变量分裂的空白。
前者速度要快得多,因为它不产生进程。
这可能是值得炫耀的一个实际的最佳实践可供选择 - 即。允许选项包含空格,水平字符等的东西。 –
...顺便说一句,这(不管是否为'$ bar'都有逗号突变为空格,这里给出的是'for $ bar'中的foo)是不好的做法,并且很容易出现错误。不要在你自己的代码中使用它。 –
...看看会发生什么,如果你试图通过这种方式传递'-name'* .txt''这两个参数对,特别是如果你在当前目录中有任何文本文件。或者看看如果您尝试传递包含空白的单个参数会发生什么情况。 –
处理逗号分隔列表的正确方式更像是:'IFS =,read -r -a opts <<<“$ cryptoptions”',这使得一个*数组*称为'opts';然后该数组可以用'for {in'in'$ opts [@]}''迭代,用'printf'%s \ n'“$ {opts [@]}”'' ,有其所有的选项修改为一个命令行用'./somecommand“$ {OPTS [@]}”'等 –