macOS Monterey에서 'sh'를 사용하지 않고 쉘 스크립트를 실행할 때 발생하는 문제

macOS Monterey에서 'sh'를 사용하지 않고 쉘 스크립트를 실행할 때 발생하는 문제

저는 쉘 스크립팅과 일반적으로 터미널 사용법을 처음 접했습니다. 최근에 script.sh전체 경로 없이 이름만 입력하여 사용하고 싶은 을(를) 만들었습니다 . 그래서 디렉토리 경로를 다음 .zprofile과 같이 썼습니다.

export "PATH=$PATH:/path/to/scriptdirectory"

다음을 사용하여 파일 권한을 변경했습니다.

% chmod +x script.sh

다음과 함께 스크립트를 사용하는 경우:

% sh myscript.sh

모든 것이 의도한 대로 원활하게 진행됩니다. 그러나 and를 생략하려고 하면 sh다음과 같이 입력합니다.

% myscript.sh

스크립트는 변수를 읽는 첫 번째 부분을 실행하기 시작하지만 값을 삽입하자마자 다음 줄이 나타납니다.

/path/to/scriptdirectory/script.sh:11: = not found

스크립트는 다음과 같습니다.

#!/bin/zsh
echo "Do you want to set or change the backup location? (type y/n)"
read SET_BACKUP
while [ "$SET_BACKUP" != "y" ] && [ "$SET_BACKUP" != "n" ]
do
    echo "Please, write y or n:"
    read SET_BACKUP
done
if [ "$SET_BACKUP" == "y" ]
then
    echo "Write the absolute path of the desired backup location:"
    read BACKUP_FOLDER
    echo "Starting backup..."
    cp -R "/fileslocation" "$BACKUP_FOLDER"
    echo "Backup completed."
else
    echo "Starting backup..."
    cp -R "/fileslocation" "$BACKUP_FOLDER"
    echo "Backup completed."
fi

답변1

차이점은 두 개의 서로 다른 쉘 인터프리터를 사용하여 스크립트를 실행한다는 것입니다.

을 사용하면 sh myscript.sh실행 /bin/sh중이고zsh가 아님. 실행 되면 sh스크립트를 읽고 myscript.sh해당 구문에 sh/bash 쉘 규칙을 사용합니다.

just 를 사용하는 경우 myscript.sh스크립트를 실행하는 데 사용되는 명령은 첫 번째 줄 #!/bin/zsh(shebang이라고도 함)에 의해 결정됩니다. 따라서 zsh구문 규칙을 사용하여 실행됩니다 .

이 작업을 수행하는 두 가지 솔루션이 있습니다.

  1. 대신 bash를 사용하도록 첫 번째 줄을 변경하십시오.#!/bin/bash
  2. zsh에서 조건문이 작동하는 방식에 대해 자세히 읽고 깨진 줄을 수정하세요(다음 줄인 것처럼 보입니다 if [ "$SET_BACKUP" == "y" ]).

답변2

이것은 실제로 답변이 아니며 형식화 된 질문에 가깝습니다.

3가지가 떠오른다:

  1. =변수 할당에는 : 주위에 공백이 있어서는 안 됩니다 .answer=42
  2. $에만 익숙하다-할당하지 말고 변수를 참조하세요. 하지 마세요.$answer=42
  3. 변수를 인용하십시오.if [ "$answer" = 42 ]

나는 당신의 마음을 읽으려고 노력하고 있습니다. 질문에 코드를 넣으십시오.

또한,https://shellcheck.net쉘 코드의 유효성을 검사합니다.

관련 정보