我试图通过printf
函数列出脚本的参数。参数通过$i
的迭代计算。 printf
函数应该包含哪些内容?
我需要像
eval echo \$$i
但在printf
函数中。
编辑:使用$i
的迭代进行循环,并且在其他代码中,我有
printf "%s" $i
但是,我需要一些代码来代替$i
,而这些代码显示了参数的价值。
就我而言,它是文件名,我需要列出它们。一次迭代中的一个文件。
答案 0 :(得分:2)
如评论中所述,您通常使用循环来执行此操作,例如:
i=1
for arg in "$@"
do
echo "$i: [$arg]"
((i++))
done
(如果不允许echo
,请使用printf "%s\n" …
,其中…
是echo
之后的所有内容。)
您也可以使用间接扩展来避免使用eval
:
for i in 1 2 3 4; do echo "$i: [${!i}]"; done
你可以用以下内容概括:
for i in $(seq 1 $#); do echo "$i: [${!i}]"; done
或
for ((i = 1; i <= $#; i++)); do echo "$i: [${!i}]"; done
例如,给定:
set -- a b 'c d' ' e f '
所有循环都产生输出:
1: [a]
2: [b]
3: [c d]
4: [ e f ]
方括号仅用于界定参数值;它允许你在第四行输出上看到尾随空白。
您也可以使用:
printf "[%s]\n" "$@"
得到:
[a]
[b]
[c d]
[ e f ]
答案 1 :(得分:1)
您要求的内容不是很清楚,但这会列出传递给脚本的参数:
while [ $# -gt 0 ]; do
printf "%s\n" "$1"
shift
done
答案 2 :(得分:0)
我猜你要求的是如何间接引用位置参数i
(我包含位置):
print "%s\n" ${!i}
答案 3 :(得分:0)
为了使您的参数能够以完全相同的值反馈到shell中,可以使用以下bash扩展名:
printf '%q ' "$@"; printf '\n'
这甚至适用于非常不寻常的情况。假设您的一个参数包含换行符:
./your-script 'hello
world' 'goodbye world'
这将在printf输出中表示:
$'hello\nworld' goodbye\ world
...你可以在shell中再次使用的东西:
$ echo $'hello\nworld' goodbye\ world
hello
world goodbye world