![通过条件转移](https://linux22.com/image/219284/%E9%80%9A%E8%BF%87%E6%9D%A1%E4%BB%B6%E8%BD%AC%E7%A7%BB.png)
我需要移动位置参数并想知道以下命令是否有效?
shift $((sft==2))
答案1
它在任何 POSIX shell 中都有效,只要
$IFS
你不要忘记引用该扩展,否则它会受到 split+glob 的影响,并且如果包含0
or则会返回错误1
:shift "$(( sft == 2 ))"
(内部的空格不是必需的,我只是为了易读性而添加它们;但在一般情况下,空格可以产生影响,就像在
bash -c 'echo "$((a-$1))"' bash -1
返回 a中一样bash: a--1: syntax error in expression (error token is "1")
,因此在算术表达式中使用空格是一个好习惯)。$sft
包含一个整数文字(不带前导 0 的十进制或十六进制;带前导 0 的数字意味着被视为八进制,尽管某些 shell 忽略了该要求。在 bash 的情况下,不仅它们被视为八进制,而且即使有其中包含 8 或 9 位数字,在这种情况下会返回错误)。请注意,如果
$sft
为 2 并且位置参数的数量为 0,则会出现错误,shift "$(( $# && sft == 2 ))"
可以避免这种情况。
$(( sft == 2 ))
扩展到 0 或 1,并且POSIXshift
接受 0 作为参数,在这种情况下它什么也不做。
其他编写方法可能是:
if [ "$#" -gt 0 ] && [ "$sft" -eq 2 ]; then
shift
fi
(如果$sft
不能保证包含数字,则使用[[...]]
或$((...))
会((...))
在 bash 中引入命令注入漏洞;[
的算术比较运算符也将前导 0 的数字视为十进制)。
在类似 Korn 的 shell 中,包括bash
:
if (( $# && sft == 2 )); then
shift
fi
或者:
(( $# && sft == 2 )) && shift
(但请注意,如果不满足条件,总体退出状态将不为零,(( $# == 0 || sft != 2 )) || shift
不会出现问题)。
在 zsh 中:
shift "$# && sft == 2"
(参数被解释为算术表达式)。
或者使用缩写形式if
:
if (( $# && sft == 2 )) shift