这里有一系列情况,其中 echo $var
可以显示与刚刚分配的值不同的值。无论分配的值是“双引号”、“单引号”还是未引号,都会发生这种情况。
如何让 shell 正确设置我的变量?
星号
预期的输出是/* Foobar is free software */
,但我得到的是文件名列表:
$ var="/* Foobar is free software */"
$ echo $var
/bin /boot /dev /etc /home /initrd.img /lib /lib64 /media /mnt /opt /proc ...
方括号
期望值是[a-z]
,但有时我得到的是一个字母!
$ var=[a-z]
$ echo $var
c
换行(换行)
预期值是一列单独的行,但所有值都在一行上!
$ cat file
foo
bar
baz
$ var=$(cat file)
$ echo $var
foo bar baz
多个空格
我希望表格标题仔细对齐,但多个空格要么消失,要么折叠成一个!
$ var=" title | count"
$ echo $var
title | count
标签
我期望有两个制表符分隔的值,但我得到的却是两个空格分隔的值!
$ var=$'key\tvalue'
$ echo $var
key value
最佳答案
在上述所有情况下,变量设置正确,但读取不正确!正确的方法是引用时使用双引号:
echo "$var"
这给出了所有给定示例中的期望值。始终引用变量引用!
为什么?
当变量未被引用时,它将:
接受 field splitting其中值在空格上拆分为多个单词(默认情况下):
之前:
/* Foobar 是免费软件*/
之后:
/*
,Foobar
,是
,免费
,软件
,*/
这些词中的每一个都将经历 pathname expansion ,其中模式被扩展为匹配文件:
之前:
/*
之后:
/bin
、/boot
、/dev
、/etc
、/home
, ...最后,所有参数都传递给 echo,echo 将它们写出 separated by single spaces , 给予
/bin /boot /dev /etc /home Foobar is free software Desktop/ Downloads/
而不是变量的值。
当变量被引用时,它将:
- 替换它的值。
- 没有第 2 步。
这就是为什么您应该始终引用所有变量引用,除非您特别需要分词和路径名扩展。 shellcheck 等工具在那里提供帮助,并会在上述所有情况下警告遗漏引号。
关于bash - 我刚刚分配了一个变量,但 echo $variable 显示了其他内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33709774/