在 shell 脚本中评估字符串

在 shell 脚本中评估字符串

我正在遵循这个 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

有关其他信息,请参阅命令行上双引号“”、单引号‘’和反引号‘’之间的区别?

相关内容