我有这个脚本:
#!/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
时,它无法正常工作且只能打印一个。
问题在哪里? 谢谢 达里奥
答案 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}}