저는 bash 구문을 처음 접했고 '.bash_aliases' 파일에 코드 조각이 있습니다. 인수로 정수를 얻거나 문자 'c'를 얻습니다. 정수를 얻으면 해당 정수를 웹 서버에서 포트로 사용할 수 있는 환경 변수에 넣습니다. 입력으로 문자 'c'를 얻으면 변수가 지워집니다.
정수로 명령을 실행하려고 하면 오류가 발생합니다.
main@linuxWSL:~$ serverp 2000
-bash: [: missing `]'
2000: command not found
문자 'c'를 사용하여 시도하면 다음과 같은 결과가 나옵니다.
main@linuxWSL:~$ serverp c
-bash: [: missing `]'
c: command not found
이것은 내 bash 코드입니다.
serverp () {
if [ "$1" = "clear" || "$1" = "c" ]
then
unset PORT
echo -e "\e$CLEAR$GREEN""mWebServer port has been reset!""$CLEAN"
return 0
fi
export PORT="$1"
}
누군가 나를 도와줄 수 있나요? 감사합니다!
답변1
[
쉘 파서가 명령줄의 나머지 부분을 다르게 해석하게 만드는 Bash의 키워드가 아닙니다. 또는 [
과 같은 명령입니다 . (like )는 Bash에 내장되어 있지만 이는 추가 프로세스를 생성하지 않고도 실행할 수 있다는 의미일 뿐이며 여전히 명령처럼 작동합니다.cat
echo
[
echo
그리고 분명히 말하면 구문 [ … ]
의 일부가 아닙니다 if … then …
. if
단지 일부 코드의 종료 상태를 테스트합니다. if true; then …
유효함, if sleep 5; then …
유효함, 유사하게 if [ … ]; then …
유효함( [ … ]
부분 자체가 유효한 명령인 경우).
[
시스템에 실행 파일이 있을 수 있습니다 . 노력하다 type -a [
. 와 비교해보세요 type -a [[
. 와는 반대로 [
는 Bash의 키워드이며 파서가 와 [[
사이의 항목을 특별히 처리하도록 만듭니다 .[[
]]
[
키워드가 아닙니다. 가 마지막 인수인 [ … ]
명령이 올바르게 작성되었습니다 . 마지막 인수로 요구합니다 . 그렇지 않으면 작동을 거부합니다. 이는 마치 특별한 구문인 것처럼 블록으로 눈에 띄게 만들기 위한 것입니다. 하지만 특별한 구문은 아닙니다.]
[
]
[ … ]
귀하는 [ "$1" = "clear" || "$1" = "c" ]
쉘에 의해 으로 해석되고 [ "$1" = "clear"
와 "$1" = "c" ]
연결됩니다 ||
. 따라서 두 가지 명령이 있습니다. 첫 번째 명령은 [ "$1" = "clear"
실행 [
되며 마지막 인수로 가져오지 않고 ]
0이 아닌 종료 상태로 불평하고 종료됩니다. 0이 아닌 상태와 로 인해 ||
쉘은 "$1"
확장되는 모든 항목으로 시작하는 두 번째 명령을 실행하려고 시도합니다. 이렇게 하면 스크립트의 첫 번째 인수가 실행할 실행 파일로 해석됩니다.
다음과 같이 수정하세요 [ … || … ]
.
[ "$1" = "clear" ] || [ "$1" = "c" ]
이 스니펫은 두 가지로 구성됩니다.유효한 [
명령. 원하는 대로 작동해야 합니다.
Note는 [[ "$1" = "clear" || "$1" = "c" ]]
작동하는 코드 조각이지만 [ "$1" = "clear" || "$1" = "c" ]
그렇지 않습니다. [[
명령이 아니기 때문이다 . 이는 키워드이며 쉘 파서가 모든 것을 특별하게 처리하게 만듭니다 ]]
. 여기에는 가 포함됩니다 ||
. 다른 것도 있습니다[[
와 의 차이점[
, 맹목적으로 교환하지 마십시오.
[
Bash의 내장 기능은 다음을 지원 합니다 -o
.또는( -a
그리고그리고), 따라서 다음과 같이 작동합니다.
[ "$1" = "clear" -o "$1" = "c" ]
||
(셸에 특별함)이 -o
(셸에 특별하지 않음) 로 대체된 코드입니다 . 그래도 피해야 합니다 -o
. 에서이 기사:
바이너리
-a
와-o
[…]는 POSIX 표준에 대한 XSI 확장입니다. POSIX-2008에서는 모두 더 이상 사용되지 않는 것으로 표시됩니다. 새 코드에서는 사용하면 안 됩니다.[ A = B -a C = D ]
(or ) 의 실질적인 문제 중 하나 는 POSIX가 4개 이상의 인수를 사용하여 또는 명령-o
의 결과를 지정하지 않는다는 것입니다 . 아마도 대부분의 쉘에서 작동하지만 믿을 수는 없습니다. POSIX 쉘용으로 작성해야 하는 경우 대신 연산자 로 구분된 두 개의 또는 명령을 사용해야 합니다 .test
[
test
[
&&
기사에서는 에 대해 자세히 설명하므로 -a
" &&
대신 연산자"를 사용하십시오. 귀하의 경우에는 각각 -o
및 입니다 ||
. 운영자 에 의해 분리된 두 개의 테스트가 ||
바로 우리의 솔루션입니다.
답변2
그것은 if [ "$1" = "clear" ] || [ "$1" = "c" ]
.