有这样的代码:
#!/bin/bash
for i in $#; do echo ${$i}; done
其中$#
应该是来自标准输入的变量数量,给出:
${$i}: bad substitution
如何列出它们而不必编写echo $0; echo $1; echo ...
以及如何在变量中替换变量本身?(即通过例如循环“构建”变量名称)
答案1
argv[] 不是标准输入。
这通常方法是完全避免索引并迭代值直接(基本上,for..in
首先应该如何工作)。代表所有参数的特殊“数组”变量是"$@"
– 是的,引号对于数组扩展正确进行是必要的:
for v in "$@"; do
echo "Got $v"
done
(不要使用不带引号的$*
或不带引号的来执行此操作$@
,因为这两者都会弄乱包含空格的参数。)
但是,如果你做也需要索引,bash 中正确的“取消引用”语法是${!i}
:
for (( i = 1; i <= $#; i++ )); do
echo "Item $i is ${!i}"
done
(请注意,迭代数值范围需要类似 C 的语法。虽然可以这样做静止的不幸的是,当像这样的变量开始参与时,使用这个范围for i in {1..10}
不起作用。但如果你不介意额外的子进程,你可以使用它。){1..$#}
for i in $(seq 1 $#)
最后,最古老的方法之一是重复shift
参数列表:
while [ "${1+yes}" ]; do
echo "Got $1"
shift
done
扩展${var+string}
用于检查变量是否设置为任意值,而不是检查非零长度的字符串。有时你可能会看到它被简化为更直接的检查——只要你 100% 确定不会有任何零长度的参数,这就可以了:
while [ "$1" ]; do
echo "Got $1"
shift
done
答案2
#!/bin/bash
for i in "$@"; do echo "${i}"; done
例子:
$ ./s.sh a b c 'white space'
a
b
c
white space