Heime Asked: 2023-04-18 10:42:30 +0800 CST2023-04-18 10:42:30 +0800 CST 2023-04-18 10:42:30 +0800 CST 通过条件转移 772 我需要移动位置参数并想知道以下命令是否有效? shift $((sft==2)) bash 1 个回答 Voted Best Answer Stéphane Chazelas 2023-04-18T13:55:29+08:002023-04-18T13:55:29+08:00 它在任何 POSIX shell 中都有效,只要 $IFS你不要忘记引用该扩展,否则它会受到 split+glob 的影响,如果包含0或会返回错误1: shift "$(( sft == 2 ))" (内部的空格不是必需的,我只是为了易读性而添加它们;但在一般情况下,间距会有所不同,例如bash -c 'echo "$((a-$1))"' bash -1which 返回 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 (也是 POSIX 和更安全的 if$sft不能保证包含数字,使用[[...]], $((...))or((...))会在这种情况下在 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
它在任何 POSIX shell 中都有效,只要
$IFS
你不要忘记引用该扩展,否则它会受到 split+glob 的影响,如果包含0
或会返回错误1
:(内部的空格不是必需的,我只是为了易读性而添加它们;但在一般情况下,间距会有所不同,例如
bash -c 'echo "$((a-$1))"' bash -1
which 返回 abash: 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 作为参数,在这种情况下它什么都不做。其他写法可能是:
(也是 POSIX 和更安全的 if
$sft
不能保证包含数字,使用[[...]]
,$((...))
or((...))
会在这种情况下在 bash 中引入命令注入漏洞;[
的算术比较运算符也将前导 0 的数字视为十进制)。在类似 Korn 的 shell 中,包括
bash
:或者:
(但请注意,如果不满足条件,整体退出状态将不为零,
(( $# == 0 || sft != 2 )) || shift
不会有问题)。在 zsh 中:
(参数在那里被解释为算术表达式)。
或使用缩写形式
if
: