需要printf脚本的参数

时间:2014-03-22 22:03:34

标签: bash

我试图通过printf函数列出脚本的参数。参数通过$i的迭代计算。 printf函数应该包含哪些内容? 我需要像

这样的东西
eval echo \$$i

但在printf函数中。

编辑:使用$i的迭代进行循环,并且在其他代码中,我有

printf "%s" $i

但是,我需要一些代码来代替$i,而这些代码显示了参数的价值。 就我而言,它是文件名,我需要列出它们。一次迭代中的一个文件。

4 个答案:

答案 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