如何在单独的行上打印从shell扩展返回的每个单词?

时间:2013-06-27 08:42:28

标签: bash shell

当我们使用shell扩展时,它会在一行中提供所有扩展的单词。例如:

#!/bin/bash 
data="Hello\ {World,Rafi}"
eval echo $data

这会产生以下输出:

Hello World Hello Rafi

是否可以像这样在单独的一行输出每一行?

Hello World 
Hello Rafi

6 个答案:

答案 0 :(得分:5)

如果我理解你正确,你想使用大括号扩展({...})生成多个单词,然后在单独的行上打印每个单词。

如果您不必将"Hello\ {World,Rafi}"存储在变量中,可以使用printf shell-builtin

执行此操作
printf "%s\n" "Hello "{Rafi,World}

一些解释:

重复使用格式字符串(此处为:%s\n),直到printf的所有参数都用尽(Reference)。

  1. %s\n消耗1个参数
  2. "Hello "{Rafi,World}返回2个字/参数,即"Hello Rafi""Hello World"
  3. 因此,此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[@]}"