通过条件转移

通过条件转移

我需要移动位置参数并想知道以下命令是否有效?

shift $((sft==2))

答案1

它在任何 POSIX shell 中都有效,只要

  • $IFS你不要忘记引用该扩展,否则它会受到 split+glob 的影响,并且如果包含0or则会返回错误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

相关内容