Shell for循环时,$1参数移位问题

在 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分支。

为什么会这样?

阅读 2.7k
1 个回答

因为你用了 shift 啊

第一次循环:没有匹配到 -d,所以就匹配 * 了,而在里面有一个 shift,所以这时 $1 已经变成 -d
第二次循环:$1 已经是 -d 了,所以就执行了 -d 的逻辑咯

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进