쉘 스크립트 실패: 구문 오류: '(' 예상치 못한

쉘 스크립트 실패: 구문 오류: '(' 예상치 못한

저는 라즈베리 파이 개발을 위한 개발 환경을 자동으로 설정하는 스크립트 작업을 해왔습니다(작업의 단계별 세부 사항은 다음과 같습니다).여기). 스크립트는 해당 기사에 링크되어 있지만 편의상 여기에서 찾을 수 있습니다.여기반품. 이제 이 스크립트를 실행하면 오류 없이 환경을 설치하고 설정할 수 있지만 기본 sudo 시간 초과로 인해 sudo 비밀번호를 여러 번 입력해야 합니다. 그래서 모든 sudo 줄을 제거하고 다음과 같이 명령줄에서 sudo를 통해 전체 스크립트를 실행하는 것부터 시작했습니다.

kemra102@ubuntuvm:~$ sudo ./pi_dev_env_install.sh

이는 예상대로 잘 작동하며 지금까지 대부분의 작업을 수행합니다.

./pi_dev_env_install: 68: ./pi_dev_env_install.sh: Syntax error: "(" unexpected

이제 이전에는 sudo 없이 전체 스크립트를 실행할 때 이 줄이 제대로 작동했습니다. 내가 아는 한 sudo가 작동을 방해하지 않기 때문에 이 줄을 실행하는 사람이 있습니까?

답변1

스크립트가 다음으로 시작하지 않습니다.셰르본좋아요, 그래서 시스템은 그것을 실행하는 데 사용합니다 /bin/sh. 우분투에서는 /bin/sh그렇습니다스프린트, 표준 기능만 갖춘 빠른 ​​시작 및 실행을 위해 설계된 셸입니다. 대시가 68행에 도달하면 구문 오류가 표시됩니다. 즉, 문맥상 괄호가 의미가 없습니다.

대시(다른 모든 쉘과 마찬가지로)는 해석기이므로 실행이 문제가 있는 행에 도달할 때까지 불평하지 않습니다. 따라서 테스트의 어느 시점에서 스크립트가 성공적으로 시작되더라도 68행에 도달하면 중단됩니다.

shebang 줄은 파일의 첫 번째 줄이어야 합니다. bash 기능을 사용하고 있으므로 파일의 첫 번째 줄은 #!/bin/bash또는 이어야 합니다 #!/usr/bin/env bash.

답변2

나에게 시작 스크립트는 다음과 같습니다.

bash ./< script file > 

잘 작동합니다.

답변3

Shebang이 첫 번째 줄에 없으면 루트 사용자의 쉘, 변수 SHELL또는 플래그에 관계없이 -s존중되지 않습니다 . 간단한 예를 통해 이를 쉽게 확인할 수 있습니다.

#
#!/bin/bash
offset=(`ls`)
echo $offset

sudo로 이 스크립트를 실행하면 최신 버전의 Ubuntu 및 Debian에서 구문 오류가 발생합니다.

스크립트가 해석되도록 하는 두 가지 옵션이 있습니다 bash.

  1. shebang을 첫 번째 줄로 이동

  2. sudo다음과 같이 실행하세요:

     sudo bash ./pi_dev_env_install.sh
    

답변4

스크립트 파일에서 dos2unix를 사용해 보세요. 때로는 소스 코드에 숨겨진 문자가 있을 수 있습니다.

주문하다:

dos2unix script_file.sh script_file.sh

관련 정보