zsh에서 위치 매개변수에 정수 값을 할당할 수 있나요?

zsh에서 위치 매개변수에 정수 값을 할당할 수 있나요?

zsh 매뉴얼을 읽고 있는데 다음을 통해 매개변수에 정수 값을 할당할 수 있다는 것을 알고 있습니다.

(( val = 1 ))

예를 들어 , 스크립트를 호출하고 첫 번째 인수가 정수인 경우 ./scirpt.zsh $((val))재할당, 비교 등과 같은 산술 프로세스를 수행하기 위해 스크립트에서 이를 어떻게 참조합니까? 코드를 다음과 같이 만들고 싶습니다.

#!/bin/zsh

(( {1} = $1++ ))

답변1

zsh에서는 배열 변수argv위치 매개변수에 액세스하는 또 다른 방법입니다. 그래서:

((argv[1]++))

답변2

보충하다@gils의 답변, 위치 매개변수에 값을 할당할 수도 있습니다외부예를 들어, 산술 표현식 1=value에서 첫 번째 위치 매개변수를 추가하려면 다음과 같이 할 수도 있습니다.

1=$(($1 + 1))

그러나 엄밀히 말하면 $1문자 그대로의 숫자 상수(예: a=++x) 뿐만 아니라 임의의 산술 표현식이 포함될 수 있는 경우 1=$((($1) + 1))두 가지가 동일해야 합니다. 비교하다:

$ x=4 zsh -c '((argv[1]++)); echo "$1 $a $x"' zsh a=++x
6 5 5
$ x=4 zsh -c '1=$(($1 + 1)); echo "$1 $a $x"' zsh a=++x
6 6 5
$ x=4 zsh -c '1=$((($1) + 1)); echo "$1 $a $x"' zsh a=++x
6 5 5

$var이는 내부 표현식 대신 var산술 표현식을 사용할 때 발생하는 일반적인 문제 중 하나 입니다. 가지고 있으면 $1당연히 쓸 수 없지만 1, 있으면 zsh쓸 수 있다 argv[1].

이러한 복잡한 사례 외에도 이 문제는 다음과 같은 실제 사례에서도 나타납니다.

$ zsh -c 'echo $((1-$1))' zsh -3
zsh:1: bad math expression: operator expected at `3'

이는 연산자 1--3의 잘못된 사용법이 되기 때문입니다 --. 다음 방법 중 하나를 사용하여 문제를 해결할 수 있습니다.

$ zsh -c 'echo $((1 - $1))' zsh -3
4
$ zsh -c 'echo $((1-($1)))' zsh -3
4
$ zsh -c 'echo $((1-argv[1]))' zsh -3
4

(첫 번째는 이와 같은 값에 대해 다른 결과를 제공하지만 1 + 1).


((argv[1]++))1 0으로 해석될 때 0 이 아닌 종료 상태가 반환된다는 사실을 무시하면$1

관련 정보