숙제: 표현인가, 명령인가?

숙제: 표현인가, 명령인가?

Bash 및 Posix 셸에는 다양한 형태의 명령이 있습니다. 추측이 맞다면 할당은 명령(특히 간단한 명령)의 한 형태입니다.

그러나 let할당 이전에 사용할 수 있으며 let표현식 이전에 사용해야 합니다. 그래서 내 말이 맞다면 할당도 표현이다.

let유무에 관계없이 할당이 모두 명령으로 사용됩니다. 둘 사이의 차이점은 무엇입니까? 제가 주로 묻는 것은 용도의 차이, 즉 언제 어떤 것을 사용해야 하는지입니다. 예를 들어

$ aaa=1

$ let aaa=1

답변1

let <EXPRESSION>그 자체로는 POSIX 규격은 아니지만 POSIX 규격 방식으로 다음과 같이 표현할 수 있습니다.

[ "$(( <EXPRESSION> ))" -ne 0 ]

일반 할당과 달리 let할당(표현식)도 평가하고 결과에 따라 종료 코드를 반환합니다.

$ aaa=1; echo $?
0
$ aaa=0; echo $?
0

$ let aaa=1; echo $?
0
$ let aaa=0; echo $?
1

답변2

내가 아는 한, let아니오POSIX 호환.주택 검사동의하다:

$ cat test.sh
#!/bin/sh
let a=3

$ shellcheck test.sh
In test.sh line 2:
let a=3
^-- SC2039: In POSIX sh, 'let' is undefined.

이것배쉬 매뉴얼 페이지설명하다:

((expression))

표현식은 아래 산술 평가에 설명된 규칙에 따라 평가됩니다. 표현식이 0이 아닌 것으로 평가되면 반환 상태는 0이고, 그렇지 않으면 반환 상태는 1입니다. 이는 let "expression"과 완전히 동일합니다.

그리고

산술 평가

쉘은 특정 상황에서 산술 표현식의 평가를 허용합니다(내장 명령 및 산술 확장 let 및 선언 참조). 0으로 나누는 것이 포착되어 오류로 표시되더라도 평가는 고정 너비 정수로 수행되며 오버플로는 확인되지 않습니다. 연산자와 그 우선순위, 결합성, 값은 C언어와 동일합니다. 다음 연산자 목록은 동일한 우선순위의 연산자별로 그룹화되어 있습니다. 레벨은 우선순위가 낮은 순서로 나열됩니다.

= *= /= %= += -= <<= >>= &= ^= |=

그리고

let arg [arg ...] 각 인수는 평가할 산술 표현식입니다(위의 산술 평가 참조). 마지막 매개변수의 값이 0이면 let은 1을 반환하고, 그렇지 않으면 0을 반환합니다.

따라서 bash에서는 할당도 표현식이며 를 사용하여 하나 이상의 표현식을 평가할 수 있으므로 let단일 let. 그러나 위에서 언급했듯이 POSIX와 호환되지 않습니다.

답변3

이는 바로 아래 문서에 let식이 필요하다는 내용이 나와 있습니다.

표현을 보자 [표현식...]

let 내장 명령을 사용하면 쉘 변수에 대해 산술 연산을 수행할 수 있습니다.각 표현식은 아래 주어진 규칙에 따라 평가됩니다.쉘 산술.마지막 표현식이 0으로 평가되면 let은 1을 반환하고, 그렇지 않으면 0을 반환합니다.

쉘 산술대입 연산자 =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=및 를 포함합니다 |=. 일반적으로 이는 추가 처리를 적용하지 않는 일반 할당문과는 아무런 관련이 없습니다.

답변4

변수 할당은 표현식이나 명령이 아니며 "간단한 명령" 구문의 일부입니다. 할당은 명령 단어 앞에 나타날 수 있으며 명령의 컨텍스트를 수정할 수 있습니다. 명령 없이 할당이 발생하면 현재 쉘의 환경이 수정됩니다.

바라보다:https://www.gnu.org/software/bash/manual/html_node/Simple-Command-Expansion.html

이 답변도 참조하십시오. 이 쉘/Bash 구문은 무엇입니까: someVariable=someValue someCommand

let@Michael Homer가 지적한 것처럼 자체 구문과 할당 연산자를 구현하는 Bash 내장 명령입니다. help let편리한 참고자료를 제공하세요.

관련 정보