3

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

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

这会产生以下输出:

Hello World Hello Rafi

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

Hello World 
Hello Rafi
4

6 回答 6

5

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

如果您不必绝对存储"Hello\ {World,Rafi}"在变量中,则可以使用printfshell-builtin

printf "%s\n" "Hello "{Rafi,World}

一些解释:

格式字符串(此处%s\n为:)将被重用,直到所有参数printf都用完(参考)。

  1. %s\n消耗 1 个参数

  2. "Hello "{Rafi,World}返回 2 个单词/参数,即"Hello Rafi""Hello World"

  3. 所以,这个printf命令相当于

     printf "%s\n%s\n" "Hello Rafi" "Hello World"
    

    除非您不必输入所有内容。

于 2013-06-28T09:01:12.387 回答
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"
于 2013-06-27T08:59:35.900 回答
3
#!/bin/bash
data="Hello\ {World'\n',Rafi'\n',Kamal'\n'}"
eval echo -e "$data"

echo -e将评估换行符。

于 2013-06-27T08:51:31.983 回答
1

eval另一种策略是使用数组,而不是使用(这是危险的,实际上不是一个好的做法——请参阅我在您的帖子中的评论)。以下将以干净安全的方式完全按照您的意愿进行:

data=( "Hello "{World,Rafi} )
printf "%s\n" "${data[@]}"
于 2013-06-28T11:10:37.883 回答
1

实际上,您的问题不是扩展,而是echo命令。根据你的系统,你可能会得到你想要的

#!/bin/bash
data="Hello\ {World\\\\n,Rafi}"
eval echo -e "$data"
于 2013-06-27T08:52:25.780 回答
1

这是不同的解决方案,但非常干净。

#!/bin/bash

names="World Rafi"
for name in $names
do
    echo Hello $name
done
于 2013-06-27T08:55:35.383 回答