当我们使用 shell 扩展时,它会在一行中给出所有扩展的单词。例如:
#!/bin/bash
data="Hello\ {World,Rafi}"
eval echo $data
这会产生以下输出:
Hello World Hello Rafi
是否可以像这样在单独的行上输出每一行?
Hello World
Hello Rafi
如果我理解正确,您想使用大括号扩展 ( {...}
) 生成多个单词,然后将每个单词打印在单独的行上。
如果您不必绝对存储"Hello\ {World,Rafi}"
在变量中,则可以使用printf
shell-builtin
printf "%s\n" "Hello "{Rafi,World}
格式字符串(此处%s\n
为:)将被重用,直到所有参数printf
都用完(参考)。
%s\n
消耗 1 个参数
"Hello "{Rafi,World}
返回 2 个单词/参数,即"Hello Rafi"
和"Hello World"
所以,这个printf
命令相当于
printf "%s\n%s\n" "Hello Rafi" "Hello World"
除非您不必输入所有内容。
与 Antarus 的答案相同,除了 echo 有“-n”。来自http://unixhelp.ed.ac.uk/CGI/man-cgi?echo
-n 不输出尾随换行符
#!/bin/bash
data="Hello\ {World,Rafi}'\n'"
eval echo -n -e "$data"
#!/bin/bash
data="Hello\ {World'\n',Rafi'\n',Kamal'\n'}"
eval echo -e "$data"
echo -e将评估换行符。
eval
另一种策略是使用数组,而不是使用(这是危险的,实际上不是一个好的做法——请参阅我在您的帖子中的评论)。以下将以干净安全的方式完全按照您的意愿进行:
data=( "Hello "{World,Rafi} )
printf "%s\n" "${data[@]}"
实际上,您的问题不是扩展,而是echo
命令。根据你的系统,你可能会得到你想要的
#!/bin/bash
data="Hello\ {World\\\\n,Rafi}"
eval echo -e "$data"
这是不同的解决方案,但非常干净。
#!/bin/bash
names="World Rafi"
for name in $names
do
echo Hello $name
done