2016-07-26 63 views
2

脚本捕获一系列逗号分隔的参数,我想知道它是如何工作的。为什么在subshel​​l调用中加密之后有3个斜杠:

for cryptopt in ${cryptoptions//,/ }; do 

这个语法对应的是什么?

+0

...顺便说一句,这(不管是否为'$ bar'都有逗号突变为空格,这里给出的是'for $ bar'中的foo)是不好的做法,并且很容易出现错误。不要在你自己的代码中使用它。 –

+0

...看看会发生什么,如果你试图通过这种方式传递'-name'* .txt''这两个参数对,特别是如果你在当前目录中有任何文本文件。或者看看如果您尝试传递包含空白的单个参数会发生什么情况。 –

+0

处理逗号分隔列表的正确方式更像是:'IFS =,read -r -a opts <<<“$ cryptoptions”',这使得一个*数组*称为'opts';然后该数组可以用'for {in'in'$ opts [@]}''迭代,用'printf'%s \ n'“$ {opts [@]}”'' ,有其所有的选项修改为一个命令行用'./somecommand“$ {OPTS [@]}”'等 –

回答

3

这不是一个“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中的每个单词,它将执行循环体,代码为dodone

0

试试这个:

cryptoptions=foo,bar,baz 
for cryptopt in ${cryptoptions//,/ }; do 
    echo $cryptopt 
done 

它有效地对应于:

for cryptopt in $(echo "$cryptoptions" | sed 's/,/ /g'); do 
    echo $cryptopt 
done 

和利用的事实,不带引号的变量分裂的空白。

前者速度要快得多,因为它不产生进程。

+0

这可能是值得炫耀的一个实际的最佳实践可供选择 - 即。允许选项包含空格,水平字符等的东西。 –