使用bash在多行中连接字符串

时间:2013-08-02 19:56:39

标签: string bash

给定一个参数列表,我试图使用bash脚本生成一个如下所示的字符串:

 - arg_1
 - arg_2
 - arg_3
 - arg_4

这是我的脚本试图这样做:

seeds=
for i in $*; do
  seeds=`printf "$seeds    - $i\n"`
done;
echo "$seeds"

但是,当我使用输入arg_1 arg_2 arg_3 arg_4运行它时,上面的脚本生成以下输出,这显然忽略了我的间距和换行符:

- arg_1 - arg_2 - arg_3 - arg_4

我可以在脚本中知道我做错了什么吗?或者有更好的方法吗?

3 个答案:

答案 0 :(得分:3)

shell中的引用和空格非常important

#!/usr/bin/env bash

for arg in "$@"; do
    seed="$seed    - $arg\n"
done
echo -ne "$seed"

演示:

$ ./script.sh arg_1 arg_2 arg_3 arg_4
    - arg_1
    - arg_2
    - arg_3
    - arg_4

答案 1 :(得分:3)

就像sudo_O所说(并且ShellCheck会指出),您应该使用"$@"而不是$*进行最小修复。

你问是否有更好的方法,但肯定有。如果给出的参数多于完成格式字符串所需的参数,printf将根据需要重复输出。这让我们简单地写一下:

printf "- %s\n" "$@" 

答案 2 :(得分:1)

我认为你的脚本太复杂了。我认为你不需要命令替换。你可以尝试这个吗

seeds=
for i in $*; do
  seeds="$seeds\n- $i"
done;
echo -e ${seeds#\\n}