我正在遵循这个 bash shell 脚本指南:
在“数字比较”部分中,引用了一个例子:
anny > num=`wc -l work.txt`
anny > echo $num
201
anny > if [ "$num" -gt "150" ]
More input> then echo ; echo "you've worked hard enough for today."
More input> echo ; fi
上面发生的事情似乎是我们将一串命令存储在 bash 变量中,然后我们在该变量上调用 echo。发生的事情似乎是对字符串进行求值,然后执行 wc 命令并将行数返回到控制终端。
好的,所以我在 Ubuntu 12.04 中启动我的终端并尝试类似的事情:
$ touch sample.txt && echo "Hello World" > sample.txt
$ cat sample.txt
Hello World
$ num='wc -l sample.txt'
echo $num
wc -l sample.txt
等一下,这并没有评估字符串并返回行数。这只是将字符串回显到终端。为什么我得到了不同的结果?
答案1
请注意符号:
‘
单引号
Enclosing characters in single quotes preserves the literal value of
each character within the quotes. A single quote may not occur between
single quotes, even when preceded by a backslash.
和
`
反引号
Command substitution allows the output of a command to replace the com‐
mand name. There are two forms:
$(command)
or
`command`
Bash performs the expansion by executing command and replacing the com‐
mand substitution with the standard output of the command, with any
trailing newlines deleted.
因此 Backquote 将命令的结果返回到标准输出。这就是为什么
`wc -l sample.txt`
返回命令的结果,而
‘wc -l 样本.txt’
只需像通常的字符串一样返回“wc -l sample.txt”
考虑这样做:
$ A='wc -l /proc/mounts'
$ B=`wc -l /proc/mounts`
$ C=$(wc -l /proc/mounts)
现在回应所有三个变量:
$ echo $A
wc -l /proc/mounts
$ echo $B
35 /proc/mounts
$ echo $C
35 /proc/mounts
答案2
如果要在变量中捕获命令的输出,则需要使用反引号``
或将命令括在$()
:
$ d=$(date)
$ echo "$d"
Mon Mar 17 10:22:25 CET 2014
$ d=`date`
$ echo "$d"
Mon Mar 17 10:22:25 CET 2014
请注意,字符串实际上是在变量声明时求值的,而不是在回显时。该命令实际上是在$()
或反引号内运行的,并且该命令的输出将保存为变量的值。
一般来说,你应该总是使用$()
而不是 反引号,因为反引号已被弃用,仅用于兼容性原因,而且使用起来更加有限。例如,你不能在反引号中嵌套命令,但你可以使用$()
:
$ echo $(date -d $(echo yesterday))
Sun Mar 16 10:26:07 CET 2014
看此主题``
在 U&L 上了解有关为何应避免的更多详细信息。
答案3
您需要使用反引号来评估表达式。
$ num=`wc -l sample.txt`
$ echo $num
1 sample.txt
如果希望在输出中仅看到“1”,请使用命令
$ num=`cat sample.txt | wc -l`
$ echo $num
1
并且还有效:
$ num=`wc -l < sample.txt`
$ echo $num
1
有关其他信息,请参阅命令行上双引号“”、单引号‘’和反引号‘’之间的区别?