Bash 字符串中的 echo 变量总是有空格
Bash echo variable in string always has spaces
我目前正在为 Nagios 开发 Mac OS X 软件更新检查 script/plugin,这样我就可以监控我的 Mac Mini和 Mac Pro 机器,无论它们是否有可用的更新。
我创建了一个名为 swUpdateCheck
的变量并将检查命令分配给它,包括一些 grep
和 awk
,以便我可以在最后处理输出。因为我并不总是想调用 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.
我目前正在为 Nagios 开发 Mac OS X 软件更新检查 script/plugin,这样我就可以监控我的 Mac Mini和 Mac Pro 机器,无论它们是否有可用的更新。
我创建了一个名为 swUpdateCheck
的变量并将检查命令分配给它,包括一些 grep
和 awk
,以便我可以在最后处理输出。因为我并不总是想调用 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.