我有一个测试脚本test.sh,我试图打印出命令行参数。但是以下内容不能按预期工作
`#!/bin/bash
for((i=1;i<"$#";i++)) do
printf "Position %s of argumentArray has %s \n", $i $(($i))
done`
(我的想法是(())将进行数学评估,结果为$ 1 $ 2等。)
for((i=1;i<"$#";i++)) do
printf "Position %s of argumentArray has %s \n", $i $"$( eval echo $i )"
done
两者在运行时如下所示给出
./test.sh first second third
Position 1 of argumentArray has 1
Position 1 of argumentArray has 2
Position 1 of argumentArray has 3
而不是
Position 1 of argumentArray has first
Position 1 of argumentArray has second
Position 1 of argumentArray has third
我遇到与
相同的问题for((i=1;i<="$#";i++))
do
case "$($i)" in
.......
案例评估为传入的实际参数的1,2 3等。
请帮助我理解我出错的地方。
答案 0 :(得分:1)
您可以使用indirect expansion来轻松完成此操作:
for((i=1;i<=$#;i++)) do
printf "Position %s of argumentArray has %s \n" $i "${!i}"
done
我还解决了上面的一些小问题:循环结束条件应该是i<=$#
来打印最后一个arg,printf
的格式字符串之后不应该有逗号,那里应该是参数("${!i}"
)周围的双引号,以防它有任何空格或其他有趣的字符。
答案 1 :(得分:0)
命令行参数可以直接访问,但如果你想按位置访问,你可以这样做:
arguments=($@)
for ((i = 0; i < ${#arguments[@]}; i++)); do
echo "arguments[$i] = ${arguments[$i]}"
done
脚本的运行:
$ ./args.sh first second third
arguments[0] = first
arguments[1] = second
arguments[2] = third
<强>附录强>
有关Bash数组的信息: