1

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

 - arg_1
 - arg_2
 - arg_3
 - arg_4

这是我尝试执行此操作的脚本:

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

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

- arg_1 - arg_2 - arg_3 - arg_4

我可以知道我在脚本中做错了什么吗?还是有更好的方法来做到这一点?

4

3 回答 3

4

引用和空格在 shell中非常重要:

#!/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
于 2013-08-02T20:02:31.217 回答
3

就像 sudo_O 说的(ShellCheck会指出),你应该使用"$@"而不是$*最小的修复。

不过,您问是否有更好的方法,而且肯定有。当给定的参数多于满足格式字符串所需的参数时,printf将根据需要重复输出。这让我们可以简单地写:

printf "- %s\n" "$@" 
于 2013-08-02T20:28:33.120 回答
1

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

seeds=
for i in $*; do
  seeds="$seeds\n- $i"
done;
echo -e ${seeds#\\n}
于 2013-08-02T20:00:36.697 回答