Bash for循环如何用空间解决变量?

时间:2015-04-17 03:19:55

标签: bash shell

在某些情况下,引号可以解决包含空格的参数。

$ command "param 1" "param 2" ...

它也适用于for循环。

$ for v in a "b c" "d e"
do
    echo "|$v|"
done
|a|
|b c|
|d e|

但是当我在in之后使用变量时,它不起作用:

$ var='a "b c" "d e"'
$ echo $var
  a "b c" "d e"
$ for v in $var
  do
      echo "|$v|"
  done
 |a|
 |"b|
 |c"|
 |"d|
 |e"|

它不起作用。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

这就是发明阵列的原因:

$ var=(a "b c" "d e")
$ for v in "${var[@]}"; do echo "|$v|"; done
|a|
|b c|
|d e|

讨论

考虑:

var='a "b c" "d e"'

上面的问题是,一旦引用引文,就会失去它的魔力。上面单引号字符串中的双引号是字符,就像任何其他字符一样:它们不再将任何内容绑定在一起。这就是为什么输出看起来像这样:

|a|
|"b|
|c"|
|"d|
|e"|

从终端读取数组

可以使用readarray以新行分隔的形式输入数组:

$ readarray -tn3 var
a 
b c
d e
$ for v in "${var[@]}"; do echo "|$v|"; done
|a|
|b c|
|d e|

-n3将输入限制为三行。 -t告诉readarray丢弃换行符。

答案 1 :(得分:0)

如评论和其他答案中所述,如果可以,请使用数组。那真的是最好的选择。

如果您被迫使用字符串(由于您的问题中未描述的某些奇怪原因),请更改内部字段分隔符,然后使用自定义字符分隔符来分隔字段。

#Copy the current IFS
SaveIFS=$IFS
IFS=';'

var='a;b c;d e;'
for v in $var; do
    echo $v
done

#Revert when done
IFS=$SaveIFS