我目前正在为Nagios开发Mac OS X软件更新检查脚本/插件,以便可以监视我的Mac Mini和Mac Pro计算机是否有可用的更新。
我创建了一个名为swUpdateCheck
的变量,并向其分配了check命令(包括一些grep
和awk
),以便最终可以处理输出。由于我并不总是想调用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.
我想念什么或做错什么了?
答案 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.