给定一个参数列表,我试图使用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
我可以在脚本中知道我做错了什么吗?或者有更好的方法吗?
答案 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}