shell:“不能移动那么多”错误

ano*_*nol 8 shell

以下脚本在我的一台机器上运行良好,1然后打印2

#!/bin/sh

echo "1"
shift
echo "2"
Run Code Online (Sandbox Code Playgroud)

然而,在另一台机器上,它产生以下输出:

1
./script.sh: 4: shift: can't shift that many
Run Code Online (Sandbox Code Playgroud)

man shift没有帮助(No manual entry for shift)。

这是什么错误,为什么会发生,我该如何解决?

ano*_*nol 10

什么是shift它是一个内置的外壳,其工作方式如下(改编自TLDP):

shift 命令接受一个参数,一个数字(如果不存在,则假定为 1)。位置参数(例如命令参数)向左移动这个数字 N。从 N+1 到 $# 的位置参数被重命名为从 $1 到 $# - N+1 的变量名称。

通常,您会创建一个循环,在其中处理一个或多个参数,然后调用 shift 以“忘记”它们并再次循环以处理以下参数。

错误原因: 错误来自以下事实,即某些 shell(但不是全部)检测到shift. 特别是,dash认为它是一个致命的错误。

可能的解决方案:

  • 测试是否有足够的剩余参数: if [ "$#" -gt 0 ]; then shift; fi

  • 添加条件参数: shift $(( $# > 0 ? 1 : 0 ))