如何按顺序打印脚本参数?

时间:2016-11-25 10:59:14

标签: bash echo

我的shell名称是 test.sh ,我想输出传递给test.sh的所有参数,但我发现我的代码无法正常运行。

#!/bin/bash
i=1
num=$#
while [ $i -le $num ]; do
    echo $($i)
    ((i++))
done

当我运行./test.sh -a -b -c时,我的预期输出为:

-a
-b
-c

但是,它告诉我

./test.sh: line 5: 1: command not found
./test.sh: line 5: 2: command not found
./test.sh: line 5: 3: command not found

如何解决此问题并使用echo命令输出所有参数?

3 个答案:

答案 0 :(得分:3)

您正在寻找variable indirection

#!/bin/bash
i=1
num=$#
while [ $i -le $num ]; do
    echo ${!i}         # <--- print the content of $1, $2...
    ((i++))
done

执行后,返回:

$ bash test.sh -a -b "-c d"
-a
-b
-c d

来自Bash Reference Manual → 3.5.3 Shell Parameter Expansion

  

如果参数的第一个字符是感叹号(!),而参数不是 nameref ,则会引入一个变量间接的级别。 Bash使用从参数的其余部分形成的变量的值作为变量的名称;然后展开此变量,并在替换的其余部分中使用该值,而不是参数本身的值。这被称为间接扩张。如果参数是 nameref ,则会扩展为参数引用的变量的名称,而不是执行完整的间接扩展。例外情况是下面描述的$ {!prefix *}和$ {!name [@]}的扩展。感叹号必须紧跟左括号以引入间接。

如果您希望更详细,请显示${1..n}到其值的映射:

#!/bin/bash
i=1
num=$#
while [ $i -le $num ]; do
    printf "$%s = %s\n" "$i" "${!i}"
    ((i++))
done

见输出:

$ bash test.sh -a -b "-c d"
$1 = -a
$2 = -b
$3 = -c d

答案 1 :(得分:1)

在Bash中,序列 CASE WHEN DATEPART(weekday,GETDATE()) = '5' THEN CASE WHEN T0.[DueDate] >= GETDATE() AND <= DATEADD(day, 15 - DATEPART(weekday, GetDate()), GetDate()) THEN Your_column1 ELSE your_column2 END END ...... 是创建一个子shell来执行命令。它是一个新的&#34;使用反引号的方式。

表达式

$(...)

相当于

$($i)

所以你正在做的是将参数作为子shell中的命令调用。

答案 2 :(得分:0)

您也可以使用单行脚本

#!/bin/bash
echo $*