我不熟悉 bash 脚本。我写了一个脚本检查参数。代码是:
for (( i=1; i<=4; i++ ))
do
if ! [[ "$"$i =~ .*[^0-9].* ]]; then
echo "bad input was $i"
fi
done
实际上我想拆分非数字参数,但似乎 "$"$i 是错误的,因为答案总是与参数无关的真或假。谁能告诉我错误是什么?
您似乎正在尝试使用间接参数扩展。
for (( i=1; i<=4; i++ ))
do
if ! [[ ${!i} =~ .*[^0-9].* ]]; then
echo "bad input was $i"
fi
done
但是,直接迭代参数而不是它们的位置更干净:
for arg in "${@:1:4}"; do
if ! [[ $arg =~ .*[^0-9].* ]]; then
echo "bad input was $arg"
fi
done
如果条件应该是这样的:
if [[ ! "$i" =~ [^0-9] ]]; then
或删除 2 个底片:
if [[ "$i" =~ [0-9] ]]; then
或使用 glob:
if [[ "$i" == *[0-9]* ]]; then
这意味着$i
包含一个数字0-9
更新:根据您的评论,您似乎正在寻找像这个脚本这样的 BASH 变量间接check-num.sh
:
#!/bin/bash
for (( i=1; i<=$#; i++ )); do
[[ "${!i}" != *[0-9]* ]] && echo "bad input was ${!i}"
done
您可以将此脚本运行为:./check-num.sh 1 2 x 4 a
请注意${!i}
这里如何使用语法来访问$1, $2, $3
称为 BASH 变量间接的变量等。您不应该$$i
用于此目的。
根据 BASH 手册:
If the first character of parameter is an exclamation point, a level of variable indirection is introduced. Bash uses the value of the variable formed from the rest of parameter as the name of the variable; this variable is then expanded and that value is used in the rest of the substitution, rather than the value of parameter itself.
使用这样的东西:
for i in "$@"; do
[[ $i =~ .*[^0-9].* ]] || echo "bad input was $i"
done
注意:没有必要在带有 [[ 内部指令的变量周围使用双引号。