处理空格和换行符

处理空格和换行符

假设用户启动了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=(...)类似异常并且每个数组项都需要再次引用。)

也可以看看:

相关内容