bash for循环中的命令行替换

时间:2011-10-22 05:20:51

标签: bash loops command-line

我有一个测试脚本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等。

请帮助我理解我出错的地方。

2 个答案:

答案 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数组的信息: