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