在搜索"shell 变量 换行符"看到CSDN上有篇用如上标题的文章,里面的内容解决了我的问题.但是有些内容不准确,这里引出来.
原文的第一段落如下:
如题,将某命令的输出结果赋值给一个变量 a
如果使用 echo $a 输出变量,则变量中的 换行都会被忽略掉,所有内容输出到一行
而使用 echo "$a" 可正常输出变量中的换行
当我们要将命令的输出保存到一个变量,再对每一行遍历进行某些操作时不能使用
- for item in "$a";do
- ## do something
- done
语法,这样取到的变量 item 不是$a 中的一行,而是以空格分隔的一个个字符串
实际上,echo $a是把变量$a里面的换行(符)[0x0a]替换成空格(符)[0x20]了;如果最末尾是一个换行(符),那么不用替换,如果最末尾不是一个换行(符),那就加上一个换行(符).用hexdump看一下就知道了.
a=1
echo $a|hexdump
echo "1"|hexdump
自己做个测试.
有个文件a.txt, 内容有两行
11 22
22 33
然后做
a=`cat a.txt`
for item in "$a";do
echo $item
echo "*"
done
得到结果:
11 22 22 33
*
====
另一种
a=`cat a.txt`
for item in "$a";do
echo "$item"
echo "*"
done
得到结果:
11 22
22 33
*
很明显,这样取到的变量 item就是整个$a!!!或则说"$a"就是一个字符串,而不是多个字符串!!!这就是shell的""语法