위치 매개변수를 이동해야 하는데 다음 명령이 작동하는지 알고 싶습니다.
shift $((sft==2))
답변1
모든 POSIX 쉘에서 작동합니다.
$IFS
확장명을 인용하는 것을 잊지 마십시오. 그렇지 않으면 분할+glob의 영향을 받게 되며0
또는 포함된 경우 오류를 반환합니다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이 없는 10진수 또는 16진수)을 포함합니다. 앞에 0이 있는 숫자는 일부 쉘이 이 요구 사항을 무시하지만 8진수로 처리됩니다. bash의 경우 8진수로 처리될 뿐만 아니라 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과 유사한 쉘에는 다음이 포함됩니다 bash
.
if (( $# && sft == 2 )); then
shift
fi
또는:
(( $# && sft == 2 )) && shift
(단, 조건이 만족되지 않을 경우 전체 종료 상태는 0이 아닌 상태가 되어 (( $# == 0 || sft != 2 )) || shift
문제가 발생하지 않으니 주의하세요.)
zsh에서:
shift "$# && sft == 2"
(인수는 산술 표현식으로 해석됩니다.)
또는 축약된 형식을 사용하십시오 if
.
if (( $# && sft == 2 )) shift