我的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
命令输出所有参数?
答案 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 $*