2

我不熟悉 bash 脚本。我写了一个脚本检查参数。代码是:

for (( i=1; i<=4; i++ ))
do
        if ! [[ "$"$i =~ .*[^0-9].* ]]; then
                echo "bad input was $i"
        fi
done

实际上我想拆分非数字参数,但似乎 "$"$i 是错误的,因为答案总是与参数无关的真或假。谁能告诉我错误是什么?

4

3 回答 3

3

您似乎正在尝试使用间接参数扩展。

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
于 2013-10-25T21:11:42.167 回答
1

如果条件应该是这样的:

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.

于 2013-10-25T19:26:24.503 回答
1

使用这样的东西:

for i in "$@"; do
     [[ $i =~ .*[^0-9].* ]] || echo "bad input was $i"
done

注意:没有必要在带有 [[ 内部指令的变量周围使用双引号。

于 2013-10-25T20:33:31.983 回答