在 shell scripting cookbook中看到如下代码
test.sh
#!/bin/bash
if [ $# -ne 3 ]; then
echo "Usage: $0 URL -d DIRECTORY"
exit -1
fi
for i in {1..4}; do
case $1 in
-d)
shift
directory=$1
shift
;;
*)
url=${url:-$1}
shift
;;
esac
done
执行脚本
# ./test.sh A -d B
此时 $1为A $2为-d $3为B
为什么在经过了for语句后,case判断的$1会匹配上-d,进入了-d)的分支? 不应该是A吗?
似乎是$2参数在经过for语句后移到了$1。
如果我将for in ... done 两行注释掉,则不会进入case的-d分支。
为什么会这样?
因为你用了 shift 啊
第一次循环:没有匹配到 -d,所以就匹配 * 了,而在里面有一个 shift,所以这时 $1 已经变成 -d
第二次循环:$1 已经是 -d 了,所以就执行了 -d 的逻辑咯