Bash 字符串中的 echo 变量总是有空格

Bash echo variable in string always has spaces

我目前正在为 Nagios 开发 Mac OS X 软件更新检查 script/plugin,这样我就可以监控我的 Mac Mini和 Mac Pro 机器,无论它们是否有可用的更新。

我创建了一个名为 swUpdateCheck 的变量并将检查命令分配给它,包括一些 grepawk,以便我可以在最后处理输出。因为我并不总是想调用 os 更新命令,所以我只是将输出导出到一个文本文件 update.txt,目前正在使用该文本文件构建最终脚本。

这是我的变量:

swUpdateCheck=`cat update.txt | grep -B1 recommended | grep -v recommended | awk '{gsub(/^[[:cntrl:][:space:]]+|^\-+|\*\s/,"");}NF>0 1' | wc -l`

文本文件的内容:

   * Security Update 2018-004-10.12.6
--
   * Safari11.1.2Sierra-11.1.2
--
   * iTunesX-12.8

现在我的问题是,每当我调用变量时,它都会扫描整个文件,并且当我回显它时应该在末尾给我一些行。使用简单的 echo 时它确实给了我一个数字,但是一旦我将变量与字符串组合在一起,它就会在数字前面添加空格,我不明白为什么。

swUpdateCheck的正常回显:

$ echo $swUpdateCheck
3

在字符串中回显swUpdateCheck

$ echo "There are $swUpdateCheck Updates available."
There are        3 Updates available.

我错过了什么或做错了什么?

swUpdateCheck里面有空格,不仅仅是3。由于您没有转义 echo $swUpdateCheck 中的变量,因此空格会被重新解释并打印出 3 个。如果将变量括在 " 中,如 echo ".... $swUpdateCheck ..." 中的空格将不会被忽略。使用 set -x:

观察输出
$ set -x
$ echo
+ echo

$ swUpdateCheck="       3"  # assigment with spaces in it
+ swUpdateCheck='       3'
$ echo           3  # leading spaces get ignored
+ echo 3
3
$ echo $swUpdateCheck  # just printing '3', this is the same as above line
+ echo 3
3
$ echo "$swUpdateCheck"  # with "
+ echo '       3'
       3
$ swUpdateCheck=${swUpdateCheck// /}  # remove spaces using bash or use sed 's/ //g' or tr -d ' ' or other
+ swUpdateCheck=3
$ echo "$swUpdateCheck"   # now swUpdateCheck is without spaces, it will work
+ echo 3
3
$ echo "There are $swUpdateCheck Updates available."
+ echo 'There are 3 Updates available.'
There are 3 Updates available.