입력이 "y", "n" 또는 기타인지 확인하는 bash 스크립트 - 작동하지 않음

입력이 "y", "n" 또는 기타인지 확인하는 bash 스크립트 - 작동하지 않음

y나는 귀하의 입력이 , 또는 다른 것인지 확인하기 위해 다음 bash 스크립트를 작성했습니다 n(이것은 더 큰 프로젝트의 일부가 될 것입니다).

#!/bin/bash

echo "Have you updated the PATH variable in your .bashrc file yet? [y/n]"
read response

        if [$response = "y"]; then
                echo "Checkpoint passed"
                set $checkpoint = "t"
        elif [$response = "n"]; then
                echo "Please set the PATH variable in your .bashrc file before running this script."
                set $checkpoint = "f"
        else            
                echo "Please only use 'y' and 'n'."
                set $checkpoint = "f"
        fi

하지만 실행할 때마다 무엇을 입력하든 다음과 유사한 오류가 발생합니다.

Have you updated the PATH variable in your .bashrc file yet? [y/n]
y
./snbjdkhome: line 6: [y: command not found
./snbjdkhome: line 9: [y: command not found
Please only use 'y' and 'n'.

그렇다면 내 코드에 어떤 문제가 있습니까? (저는 쉘 스크립팅을 처음 접했습니다.)

답변1

이렇게 하면 명확해집니다(공백 확인).

$ var=c

$ ["$var" == "c"] && echo "OK"
[c: command not found

$ ["$var" == "c" ] && echo "OK"
[c: command not found

$ [ "$var" == "c"] && echo "OK"
bash: [: missing `]'

$ [ "$var" == "c" ] && echo "OK"
OK

test따라서 ( ) 명령을 사용할 때에는 조건 앞뒤에 공백을 넣어야 합니다 [ ].

답변2

6행과 9행에 간단한 오류가 하나 있습니다. 6행에서는 와 [사이 에 공백이 있어야 합니다. . 마찬가지로 9행 의 경우 와 온라인에서도 마찬가지입니다.$responseif [$response = "y"]then[$response

$response또한 사용자가 공백을 사용하여 입력하는 경우 오류를 방지하려면 이중 인용 부호를 넣어야 합니다 .

답변3

게다가 set명령어도 생각보다 이색적이다. 변수를 설정하기 위해 명령 을 사용하지 않습니다 set.

$1매개변수가 포함된 쉘 스크립트를 호출하면 해당 매개변수가 , $2, $3, … 에 할당된다는 것을 알고 있습니다  . 오른쪽? 잘, 하나명령이 수행하는 작업 중 , , , ...를 set설정하는 것입니다. $1$2$3현재의 (대화형) 쉘. 예를 들어,

% set checkpoint="y"
% echo "$checkpoint"
                                (nothing)
% echo "arg1 = '$1', arg2 = '$2', arg3 = '$3'"
arg1 = 'checkpoint=y', arg2 = '', arg3 = ''
% set checkpoint = "y"
% echo "$checkpoint"
                                (nothing)
% echo "arg1 = '$1', arg2 = '$2', arg3 = '$3'"
arg1 = 'checkpoint', arg2 = '=', arg3 = 'y'

그것은 당신이 원하는 것이 아닙니다.

그리고 또 다른 문제가 있습니다. 올바른 구문은 다음과 같습니다.

checkpoint="t"

당신이 말하는 경우

$checkpoint="t"

설정되지 않은 경우 $checkpoint이 명령은 다음과 같이 줄어듭니다.

="t"

=t(아마 존재하지 않을 수도 있음) 이라는 프로그램을 찾습니다 . 비슷하게,

$checkpoint = "t"

로 감소

= "t"

라는 프로그램을 찾습니다 =. 더 나쁜 것은 가 $checkpoint이미 로 설정되어 있고 다음 "t"과 같이 말하는 경우입니다.

$checkpoint="f"

그러면 그것은 다음과 같이 해석된다.

t="f"

따라서 변수 t(즉, $t)를 설정합니다.

답변4

Bash는 귀하의 $response 명령을 찾을 수 없는 명령으로 해석합니다. 비교하는 문자열처럼 큰따옴표로 묶으면 예상대로 작동합니다.

관련 정보