a =(一二三) - 为什么$ a中的x只能循环“一”?

时间:2016-07-11 15:59:22

标签: linux bash

我有这个脚本:

#!/bin/bash
if [ -z "$1" ]; then
    echo "usage: ./test.sh [one|two|three|four|five]"
    exit
elif [ $# -eq 1 -a $1 = "all" ]; then
    params=("one" "two" "three" "four" "five")
else
    params=$@
fi

echo "=========="

for param in $params
do
    if [ $param = "one" ]; then
        echo "one"
    elif [ $param = "two" ]; then
        echo "two"
    elif [ $param = "three" ]; then
        echo "three"
    elif [ $param = "four" ]; then
        echo "four"
    elif [ $param = "five" ]; then
        echo "five"
    fi
    echo "=========="
done

如果我尝试使用./test.sh one./test.sh two ecc,但是当我尝试./test.sh all时,它无法正常工作且只能打印一个。

问题在哪里? 谢谢 达里奥

2 个答案:

答案 0 :(得分:4)

for param in $params

...是扩展数组的错误方法。相反,使用:

params=( "$@" )
for param in "${params[@]}"

要解释为什么数组语法更好,请考虑以下事项:

params=( "first item" "second item" "third item" )
for param in "${params[@]}"; do
  echo "$param"
done

...你不能用字符串语法这样做(保持你的话语)。

答案 1 :(得分:0)

不是将你的args存储在for param in "$@"; do 中,而是将所有值存储在args中,例如:

case "$param" in
    one)
        echo one
        ;; # equivalent of "break"
    two)
        echo two
        ;;
    *)
        echo default case
        ;;
esac

然后,你不必使用bash数组,你可以简单地迭代:

"['S', [('I', 'PRP'), (',', ','), ('PERSON', [('Vladamir', 'NNP'), ('Putin', 'NNP')]), (',', ','), ('have', 'VBP'), ('never', 'RB'), ('been', 'VBN'), ('more', 'RBR'), ('frustrated', 'JJ'), ('in', 'IN'), ('my', 'PRP$'), ('life', 'NN'), ('.', '.')]]"

通常,使用仅限bash的功能(称为 bashisms ),但它们可能不必要且不太便携。

另一件事,用案例取代大ifelse:

{{1}}