如何在 for 循环中列出来自 stdin 的所有变量?

如何在 for 循环中列出来自 stdin 的所有变量?

有这样的代码:

#!/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

相关内容