var=$[3 * 2] 직관적인 인식과 충돌하는 것 같습니다 [닫기]

var=$[3 * 2] 직관적인 인식과 충돌하는 것 같습니다 [닫기]

$밖 이 헷갈려요var3=$[$var1 * $var2]

다음 스크립트가 있다고 가정합니다.

$ var1=5; var2=6; var3=$[$var1 * $var2]; echo $var3
30

제거 되면 $오류가 보고됩니다.

$ var1=5; var2=6; var3=[$var1 * $var2]; echo $var3
-bash: Algorithms: command not found
30
$ var=[3 * 2]; echo $var
-bash: Algorithms: command not found
[3*2]

그렇게 말하면 기분이 이상해요.

$ var=$[3 * 2]; echo $var
6

직관적으로 실행 가능성은 높습니다.

$ var=$6; echo $var

이건 이상해요.

문법이 이를 수행하도록 하는 메커니즘은 무엇입니까?

변수 대체인가요?

답변1

문법 $[ ... ](및 표준 형식 $(( ... )))은 내용을 산술 표현으로 해석합니다. 그렇지 않다면 $그렇지 않을 것입니다. 완전히 다른 것으로 해석될 수도 있습니다. echo결과를 직접 입력하면 이를 더 잘 볼 수 있습니다 .

$ var1=5; var2=6
$ echo $[$var1 * $var2]    # This gets interpreted as arithmetic
30
$ echo [$var1 * $var2]    # This doesn't
[5 file1.txt file2.txt file3.txt file4.txt file5.txt file6.txt 6]

여기서 [$var1및 는 $var2]완전히 독립적인 문자열로 처리되며 각각 "[5" 및 "6]"으로 평가됩니다. 반면에 는 *파일 이름 와일드카드로 해석되어 현재 디렉터리의 파일 목록으로 확장됩니다. 이제 명령을 내리세요.

$ var3=[$var1 * $var2]
-bash: file1.txt: command not found

일어나는 일은 위와 매우 유사합니다. *파일 목록으로 확장되므로 명령이 작동합니다.

var3=[5 file1.txt file2.txt file3.txt file4.txt file5.txt file6.txt 6]

var=value command arguments......이것은 "file2.txt", "file3.txt" 등의 매개변수가 있는 명령의 변수를 "[5"로 설정하려고 시도하는 것으로 해석됩니다 . 귀하의 경우를 제외하고 현재 디렉터리(또는 디렉터리)의 첫 번째 파일 이름은 "file1.txt" 대신 "Algorithms"로 지정됩니다. 두 경우 모두 유효한 명령 이름이 아니므로 "명령을 찾을 수 없음" 오류가 발생합니다.var3file1.txt

그런데 @devWeek가 지적했듯이 $[ ]더 이상 사용되지 않으므로 대신 사용해야 합니다 $(( )). 그러나 다시 말하지만 이는 $선택 사항이 아닙니다.

$ echo $(($var1 * $var2))    # This gets interpreted as arithmetic
30
$ echo (($var1 * $var2))    # This doesn't
-bash: syntax error near unexpected token `('

그러나 $6의미는 여전히 다릅니다. 현재 스크립트/함수/기타 콘텐츠의 여섯 번째 매개변수를 나타냅니다. 대화형 셸에는 일반적으로 인수가 없으므로 비어 있는 것으로 평가됩니다.

$ echo $[ 6 ] placeholder    # This gets interpreted as arithmetic
6 placeholder
$ echo $6 placeholder    # This doesn't
placeholder

기본 요점: 쉘 구문은매우 까다롭다, 특히 직관적이지 않습니다. 기호 한두 개를 생략하면(또는 잘못된 위치에 공백을 추가하거나 제거해도) 의미가 완전히 바뀌게 됩니다.

답변2

명령 별칭 [=test는 Linux에서 사용되므로 [ 문자도 test 명령을 호출합니다.

이 시도를 증명하기 위해man [

실제로 BASH의 $(xstr) 구문 분석과 관련된 문제나 버그 보고서를 게시하려고 합니다. 내 생각에 평가는 $(0) 처럼 일어나고 데이터 스트림은 항상 bash인 $0 변수에 주입됩니다.

일부 언어에서는 $ 문자가 문자열에 사용되지만 bash에서는 명령줄 인수(인수라고도 함)에 사용되며 sed 명령에 사용되는 정규식에서 $는 종료 키 .

man bash전개 순서를 배우려면 읽어야 한다고 생각합니다 .

BASH가 $ 문자를 볼 때 BASH를 다시 ​​실행할 때 메모리 누수로 보이는 것에 대한 큰 변화를 설명하려고 합니다.

내가 보여줄게

//상위 명령을 무시한 다음 i 버튼[1]+상단 중지

root@ubuntu-studio:/var# echo $0
bash
root@ubuntu-studio:/var# echo $(0)
0: command not found

관련 정보