【shell】(20231101) for循环遍历时加不加引号的区别

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


## 执行
# ll
total 4
-rw------- 1 root root 1805 Jul 7 18:07 anaconda-ks.cfg
# lines=(
"* 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


## 执行
# ll
total 4
-rw------- 1 root root 1805 Jul 7 18:07 anaconda-ks.cfg
# lines=(
"* 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


## 执行
# ll
total 4
-rw------- 1 root root 1805 Jul 7 18:07 anaconda-ks.cfg
# lines=(
"* 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


## 执行
# ll
total 4
-rw------- 1 root root 1805 Jul 7 18:07 anaconda-ks.cfg
# lines=(
"* 12 34"
"* 56 78"
)
for line in "${lines[@]}"
do
echo "$line"
done
* 12 34
* 56 78

解释

1
2
var="* 12 23" 
echo $varecho "$var"为什么输出不一样?

echo $varecho "$var" 之所以输出不一样,是因为它们在处理变量时对空白字符(空格、制表符、换行符等)的方式不同。在Shell中,双引号 " 和不使用引号之间的差异是关键。

  1. echo $var: 当您使用 echo $var 时,Shell会对变量进行参数扩展(Word Splitting)。这意味着空白字符被用作分隔符,将变量的值分割成多个参数,然后将这些参数传递给echo命令。在这种情况下,$var 中的空白字符将被用作分隔符,所以 *1223 会被视为不同的参数,而不是单个参数。

  2. echo "$var": 当您使用 echo "$var" 时,双引号将变量的值视为一个整体,不会进行参数扩展。因此,$var 中的空白字符保持不变,作为一个整体传递给echo命令,所以输出将是 * 12 23,而不是分解成多个参数。
    这个差异在处理包含空白字符的字符串时非常重要,因为它影响到如何处理字符串中的空白字符。如果您希望保留字符串中的空白字符并将整个字符串作为一个参数传递给echo或其他命令,您应该使用双引号 "$var" 来引用变量。如果需要将字符串拆分为多个参数,可以不使用引号 echo $var,以便Shell执行参数扩展。


【shell】(20231101) for循环遍历时加不加引号的区别
http://example.com/2023/11/01/shell/【shell】(20231101) for循环遍历时加不加引号的区别/
作者
ningan123
发布于
2023年11月1日
许可协议