![](/img/trans.png)
[英]How to properly do command substitution and concatenation in bash script and display output
[英]How do I stop multiple line output from command substitution from being concatenated in BASH script?
我在多个子目录中有文本文件
一些/路径/一个/文件
一些/路径/二/文件
一些/路径/三相/文件
一些/路径/富/文件
...
我需要能够grep文件以获得匹配,但保留单独的行返回,以便我可以稍后使用循环单独操作每个匹配。
我有:
SITE=$(grep -w $1 some/path/*/file)
然而,这只会产生一个非常长的字符串,所有内容都只是在一行中一起消失。
理想情况下,此变量将包含每行上路径名的*值:
例如:
一些/路径/一个/文件
一些/路径/三相/文件
包含一个包含bar
的行。
SITE=$(grep -w bar some/path/*/file)
echo $SITE
应该是这样的:
some/path/one/file:this is a line of text that has bar in it
some/path/three/file:this is a line of text that has bar in it
但相反,我明白了:
some/path/one/file:this is a line of text that has bar in it some/path/three/file:this is a line of text that has bar in it
有没有办法使这个变量多行,以便以后我可以做的事情:
for i in `echo $SITE`; do
WHATEVER=$(echo $i | cut -d ':' -f 1 | cut -d '/' -f 3)
echo $WHATEVER
done
并输出为:
one
three
或者我完全以错误的方式解决这个问题?
$()
命令替换不是将输出压缩到一行; 它是一个不带引号的变量的echo
。 如果您echo "$SITE"
,您将看到多行输出。
话虽如此,逐行读取的常用方法是while read
构造。 你可以这样做:
while read line; do
WHATEVER=$(echo "$i" | cut -d ':' -f 1 | cut -d '/' -f 3)
echo $WHATEVER
done < <(grep -w bar some/path/*/file)
注意我们可以在最后一行使用管道而不是<()
进程替换,但如果在while循环中设置的变量需要保留在while循环之外的范围内,则上述情况会更好。
当然,如果您只需要输出,那么以下内容就更简单了:
grep -w bar some/path/*/file | cut -d ':' -f 1 | cut -d '/' -f 3
如果仅用于显示,则总是echo -e "$SITE"
。 -e
选项保留所有选项卡,空格和换行符。 不要忘记引号。
如果要稍后在脚本中处理每一行,可以尝试以下操作:
echo -n "$SITE" | while read line ; do
echo "$line"
done
IFS=$'\\r\\n' LINES=($(grep -w $1 some/path/*/file))
这将创建一系列行
然后,您可以遍历数组并单独处理每一行${LINES[i]}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.