字符串中的Bash回声变量始终带有空格

时间:2018-09-11 13:46:28

标签: bash echo

我目前正在为Nagios开发Mac OS X软件更新检查脚本/插件,以便可以监视我的Mac Mini和Mac Pro计算机是否有可用的更新。

我创建了一个名为swUpdateCheck的变量,并向其分配了check命令(包括一些grepawk),以便最终可以处理输出。由于我并不总是想调用os update命令,因此我只是将输出导出到文本文件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

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

swUpdateCheck的正常回声:

$ echo $swUpdateCheck
3

在字符串中回显swUpdateCheck

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

我想念什么或做错什么了?

1 个答案:

答案 0 :(得分:2)

swUpdateCheck中包含空格,而不仅仅是3。由于您没有在echo $swUpdateCheck中转义变量,因此将重新解释空格,并打印出3 get。如果将变量括在"中,例如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.