以下脚本在我的其中一台机器上运行良好,1
然后打印2
:
#!/bin/sh
echo "1"
shift
echo "2"
然而,在另一台机器上,它产生以下输出:
1
./script.sh: 4: shift: can't shift that many
man shift
没有帮助(No manual entry for shift
)。
这个错误是什么,为什么会发生,我该如何修复它?
答案1
什么是shift
:它是一个内置的 shell,其工作方式如下(改编自局部差分协议):
shift 命令接受一个参数,即数字(如果不存在,则假定为 1)。位置参数(例如命令参数)按此数字 N 向左移动。从 N+1 到 $# 的位置参数被重命名为从 $1 到 $# - N+1 的变量名。
通常,你会创建一个循环来处理一个或多个参数,然后调用 shift 来“忘记”它们,并再次循环来处理接下来的参数。
错误原因:
这个错误是由于一些 shell(但不是全部)检测到没有足够的参数shift
。具体来说,dash
它会将其视为致命错误。
可能的解决方案:
测试是否有足够的剩余参数:
if [ "$#" -gt 0 ]; then shift; fi
添加条件参数:
shift $(( $# > 0 ? 1 : 0 ))