조건부 전송

조건부 전송

위치 매개변수를 이동해야 하는데 다음 명령이 작동하는지 알고 싶습니다.

shift $((sft==2))

답변1

모든 POSIX 쉘에서 작동합니다.

  • $IFS확장명을 인용하는 것을 잊지 마십시오. 그렇지 않으면 분할+glob의 영향을 받게 되며 0또는 포함된 경우 오류를 반환합니다 1.

    shift "$(( sft == 2 ))"
    

    (내부 공백은 필수가 아니며 가독성을 위해 추가했을 뿐입니다. 그러나 일반적으로 공백은 bash -c 'echo "$((a-$1))"' bash -1a를 반환하는 것처럼 효과를 가질 수 있으므로 bash: a--1: syntax error in expression (error token is "1")산술 표현식에서 공백을 사용하는 것이 좋습니다.)

  • $sft정수 리터럴(앞에 0이 없는 10진수 또는 16진수)을 포함합니다. 앞에 0이 있는 숫자는 일부 쉘이 이 요구 사항을 무시하지만 8진수로 처리됩니다. bash의 경우 8진수로 처리될 뿐만 아니라 8자리 또는 9자리일 경우 오류가 반환됩니다.

  • $sft2이고 위치 인수 개수가 0 이면 오류가 발생하므로 shift "$(( $# && sft == 2 ))"이를 방지할 수 있습니다.

$(( sft == 2 ))0 또는 1로 확장됩니다.POSIXshift0을 인수로 받아들이고, 이 경우 아무 작업도 수행하지 않습니다.

이를 작성하는 다른 방법은 다음과 같습니다.

if [ "$#" -gt 0 ] && [ "$sft" -eq 2 ]; then
  shift
fi

( $sft숫자가 포함되는 것이 보장되지 않는 경우 을 사용하면 bash에 명령 주입 취약점이 발생할 [[...]]수 있습니다 . 산술 비교 연산자는 앞에 0이 있는 숫자도 소수로 처리합니다.)$((...))((...))[

Korn과 유사한 쉘에는 다음이 포함됩니다 bash.

if (( $# && sft == 2 )); then
  shift
fi

또는:

(( $# && sft == 2 )) && shift

(단, 조건이 만족되지 않을 경우 전체 종료 상태는 0이 아닌 상태가 되어 (( $# == 0 || sft != 2 )) || shift문제가 발생하지 않으니 주의하세요.)

zsh에서:

shift "$# && sft == 2"

(인수는 산술 표현식으로 해석됩니다.)

또는 축약된 형식을 사용하십시오 if.

if (( $# && sft == 2 )) shift

관련 정보