shell中倒引号的一个问题

水海云 发布于 2013/02/03 09:18
阅读 753
收藏 1

在bash命令行上执行ps命令有如下输出:

ps
  PID TTY          TIME CMD
10617 pts/6    00:00:01 bash
21329 pts/6    00:00:00 ps
而执行如下命令则输出变为:

lzhong@ubuntu:~/work/src_test$ echo `ps`
  PID TTY          TIME CMD 10617 pts/6    00:00:01 bash 21339 pts/6    00:00:00 ps
lzhong@ubuntu:~/work/src_test$
因而出现了如下的命令结果:

lzhong@ubuntu:~/work/src_test$ ps |wc -l
4
lzhong@ubuntu:~/work/src_test$ echo `ps`|wc -l
1
lzhong@ubuntu:~/work/src_test$
问题:

  1. 倒引号执行shell命令后得到的字符串,变成了单行文本,与shell命令单独执行的标准输出不一致,不再有换行符,为什么会这样?使用cat命令显示文件内容的结果也是如此。
  2. 但是却可以在shell脚本中的for循环里使用倒引号实现按行循环取出倒引号执行结果的内容进行处理,和echo命令的结果有点矛盾?如下的代码使用:

IFS=$'\n'  #更改字段分隔符为换行符
for line in `cat file.txt`
do
    echo $line
done

加载中
1
panzhc
panzhc
加双引号,echo "`ps`"
水海云
水海云
第一个问题正解,加双引号后换行符出现,但是第二个问题还是不明白。
1
panzhc
panzhc
回复 @水海云 : 结果变成一行的时候用了echo,而for循环没有用,我觉得是echo命令吃掉了换行符;子shell或者是反引用返回的结果集中还是包含换行符的。看下面的两个例子:
$ lines="1
2
3 4
5"
$ echo $lines
$ for line in $lines; do
echo $line
done
可见:
1、echo吃掉了换行符;
2、for按IFS(默认为换行符、制表符或者空格)分割输出;
3、将lines=`ps`,然后for看下,结果会每行输出一个词组;
4、解决这个问题的最佳办法已经给出了,就是外面套双引号。
水海云
水海云
对于echo为什么会吃掉变量中的换行符我很不解。因为如果我直接echo一个带换行符的字符串是可以原样输出的,就如你的例子: $ echo "1 2 3 4 5" 是可以得到原样的输出的。
0
L_B
L_B
会不会是`xx`,命令xx的一次结果文本是 一个整体行文本信息,而换行不解析了(变成一个普通字符),而for中echo则是逐个执行且全部解析打印文本?
水海云
水海云
这也是我的疑问
返回顶部
顶部