假设用户启动了5个进程,用下面的句子查询什么:
cuser=`whoami`
a="`ps -C process -o user= | grep $cuser`"
echo $a
user user user user user
对阵
echo "`ps -C process -o user= | grep $cuser`"
user
user
user
user
user
然后看起来在第一种情况下“换行符”或“\n”被转换为空格,这似乎是个好主意。
看起来很难看出在不同情况下 shell 如何处理空格和换行符。
可能需要一本完整的手册来检查每次如何处理空格和换行符。
对于如何在各种情况下处理这些问题,您有什么建议吗?
这里请注意,“换行符”被转换为“空格”。
echo "$a" 似乎会保留换行符。这可能是 echo 命令属性将换行符转换为空格。
答案1
不要相信 echo;用declare -p
它来检查变量的内容。
简而言之:
带引号的字符串(包括双引号内的任何类型的变量扩展)保留所有空格。整个字符串作为单个参数发送到
echo
。$ foo="one two 'three four'" $ ~/bin/args "$foo" argv[0] = args argv[1] = one two 'three four' $ ~/bin/args '$foo' argv[0] = args argv[1] = $foo
不带引号的字符串或扩展是须遵守单词拆分;每个用 IFS 分隔的单词都成为给予 的单独参数
echo
,并且 echo 命令使用单个空格作为分隔符重新连接其所有参数。$ foo="one two 'three four'" $ ~/bin/args $foo argv[0] = args argv[1] = one argv[2] = two argv[3] = 'three argv[4] = four'
变量赋值的右侧是规则的一个例外;其中的扩展总是像被双引号括起来一样工作。它们是等效的:
foo=$(ps ...) foo="$(ps ...)" foo=`ps ...` foo="`ps ...`"
(数组赋值
foo=(...)
类似到异常并且每个数组项都需要再次引用。)
也可以看看: