`구문 오류 : 배열을 만들 때“(”예기치 않은 것


35

두 개의 (데비안) Linux 서버가 있습니다. 쉘 스크립트를 작성 중입니다.

첫 번째 배열에서는 다음과 같이 배열을 만듭니다.

#!/bin/bash
target_array=(
    "/home/user/direct/filename -p123 -r"
)

잘 작동합니다. 그러나 다른 서버에서 이것을 실행하면 다음과 같은 결과가 나타납니다.

Syntax error: "(" unexpected

내가 알 수있는 한 두 서버가 동일합니다. 왜 이것이 작동하지 않는지 누군가가 밝힐 수 있습니까?

터미널에 직접 입력하면 괜찮습니다 ??


내가 그것을 실행할 때 나타납니다

sh scriptname.sh

오류가 발생하지만 다음과 같이 실행하면

./scriptname.sh

괜찮은 것 같습니다. 차이점이 뭐야?


두 서버간에 스크립트를 복사하여 붙여 넣었습니까? 시도 cat -v <script>가짜 문자가 있는지.
— LilloX

2
sh되지 않는 bash등을 실행하고 그렇게하는 것은 sh scriptname.sh잘못이다
— 에릭 Renouf

답변:


54

사용할 때는 첫 번째 줄에서 ./scriptname.sh와 /bin/bash같이로 실행 됩니다 #!. 하지만 당신이 사용하는 경우 sh scriptname.sh는 실행 sh하지 bash.

sh쉘은 배열을 생성 할 구문이 없지만, 배쉬는 사용되는 구문이 있습니다.


좋아, 이제 말이 되네 아시다시피 Linux에 익숙하지 않습니다 (현재 Powershell 스크립트 셸 / bash 스크립트를 변환하려고합니다). 앞으로도 계속 사용하겠습니다 ./. 건배
— IGGt

즉 반드시 아니지만 사이에 조정이 있어야 #!/bin/sh하고 sh script.sh(또는 #!/bin/bash과 bash script.sh)
— 콘스탄틴 Morenko

3
sh 언어에는 배열 ( a[index]=x또는 a=(x y)) 이 없습니다 . 일부 sh 인터프리터는 배열을 지원하며 ksh88 (Linux AFAIK로 포팅되지 않음) 만 지원하고 일부 이전 pdksh 변형은 지원 a[index]=value하지 않습니다 a=(x y). 데비안에서는 sh일반적으로 dash배열을 지원 a[index]=x하지 않습니다 (작동하지 않습니다).
— Stéphane Chazelas

1
지금부터 조각으로 죽을 수 있습니다! :)
— Paulo

0

실행 ./scriptname.sh하면 파일의 첫 번째 줄을 읽고 ʻ / bin / bash '를 실행하고 나머지 스크립트를 인터프리터에 sh scriptname.sh전달해야 하며 실행 하면 파일이 사용자의 표준 쉘 (예 : Ash)에 전달됩니다. 다른 인터프리터가 Bash처럼 배열을 지원하지 않는 경우가 있습니다.


1
sh"사용자의 표준 쉘"일 필요는 없습니다. 종종 자체 실행 파일 (또는 symlink)이며 sh스크립트를 처리하기 위해 호출됩니다. 해당 사용자의 기본 로그인 쉘이 다음과 같은 경우에도 마찬가지입니다.bash
— Eric Renouf

그것은 내가 지금 완전히 확신하지 못한 부분이었습니다. 설명 주셔서 감사합니다!
— dave_alcarin

0

을 사용하면 반드시을 sh scriptname.sh(를) 사용할 sh필요는 없습니다 bash. sh --version두 기계를 비교해보십시오 . 그리고 / 또는과 dpkg -S $(which sh).


해도 sh에 심볼릭 링크 bash로 호출 할 때 다르게 동작합니다sh
— 에릭 Renouf
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.