当我们使用shell扩展时,它会在一行中提供所有扩展的单词。例如:
#!/bin/bash
data="Hello\ {World,Rafi}"
eval echo $data
这会产生以下输出:
Hello World Hello Rafi
是否可以像这样在单独的一行输出每一行?
Hello World
Hello Rafi
答案 0 :(得分:5)
如果我理解你正确,你想使用大括号扩展({...}
)生成多个单词,然后在单独的行上打印每个单词。
如果您不必将"Hello\ {World,Rafi}"
存储在变量中,可以使用printf
shell-builtin
printf "%s\n" "Hello "{Rafi,World}
重复使用格式字符串(此处为:%s\n
),直到printf
的所有参数都用尽(Reference)。
%s\n
消耗1个参数"Hello "{Rafi,World}
返回2个字/参数,即"Hello Rafi"
和"Hello World"
因此,此printf
命令等同于
printf "%s\n%s\n" "Hello Rafi" "Hello World"
除了您不必输入 all 之外。
答案 1 :(得分:3)
#!/bin/bash
data="Hello\ {World'\n',Rafi'\n',Kamal'\n'}"
eval echo -e "$data"
echo -e 将评估换行符。
答案 2 :(得分:3)
与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"
答案 3 :(得分:1)
实际上,你的问题不是扩展而是echo
命令。
#!/bin/bash
data="Hello\ {World\\\\n,Rafi}"
eval echo -e "$data"
答案 4 :(得分:1)
这是不同的解决方案,但非常干净。
#!/bin/bash
names="World Rafi"
for name in $names
do
echo Hello $name
done
答案 5 :(得分:1)
不是使用eval
(这是危险的,实际上不是一个好的做法 - 请参阅我在帖子中的评论),另一种策略是使用数组。以下内容将以干净,安全的方式完成您的需求:
data=( "Hello "{World,Rafi} )
printf "%s\n" "${data[@]}"