1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| lines=( "* 12 34" "* 56 78" ) for line in ${lines[@]} do echo $line done
total 4 -rw------- 1 root root 1805 Jul 7 18:07 anaconda-ks.cfg
"* 12 34" "* 56 78" ) for line in ${lines[@]} do echo $line done anaconda-ks.cfg 12 34 anaconda-ks.cfg 56 78
|
2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| lines=( "* 12 34" "* 56 78" ) for line in ${lines[@]} do echo "$line" done
total 4 -rw------- 1 root root 1805 Jul 7 18:07 anaconda-ks.cfg
"* 12 34" "* 56 78" ) for line in ${lines[@]} do echo "$line" done anaconda-ks.cfg 12 34 anaconda-ks.cfg 56 78
|
3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| lines=( "* 12 34" "* 56 78" ) for line in "${lines[@]}" do echo $line done
total 4 -rw------- 1 root root 1805 Jul 7 18:07 anaconda-ks.cfg
"* 12 34" "* 56 78" ) for line in "${lines[@]}" do echo $line done anaconda-ks.cfg 12 34 anaconda-ks.cfg 56 78
|
4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| lines=( "* 12 34" "* 56 78" ) for line in "${lines[@]}" do echo "$line" done
total 4 -rw------- 1 root root 1805 Jul 7 18:07 anaconda-ks.cfg
"* 12 34" "* 56 78" ) for line in "${lines[@]}" do echo "$line" done * 12 34 * 56 78
|
解释
1 2
| var="* 12 23" echo $var和echo "$var"为什么输出不一样?
|
echo $var
和 echo "$var"
之所以输出不一样,是因为它们在处理变量时对空白字符(空格、制表符、换行符等)的方式不同。在Shell中,双引号 "
和不使用引号之间的差异是关键。
echo $var
: 当您使用 echo $var
时,Shell会对变量进行参数扩展(Word Splitting)。这意味着空白字符被用作分隔符,将变量的值分割成多个参数,然后将这些参数传递给echo
命令。在这种情况下,$var
中的空白字符将被用作分隔符,所以 *
、12
和 23
会被视为不同的参数,而不是单个参数。
echo "$var"
: 当您使用 echo "$var"
时,双引号将变量的值视为一个整体,不会进行参数扩展。因此,$var
中的空白字符保持不变,作为一个整体传递给echo
命令,所以输出将是 * 12 23
,而不是分解成多个参数。
这个差异在处理包含空白字符的字符串时非常重要,因为它影响到如何处理字符串中的空白字符。如果您希望保留字符串中的空白字符并将整个字符串作为一个参数传递给echo
或其他命令,您应该使用双引号 "$var"
来引用变量。如果需要将字符串拆分为多个参数,可以不使用引号 echo $var
,以便Shell执行参数扩展。