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


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/bashbash 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.