[string] bash : 나쁜 대체

#!/bin/bash

jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}

이 bash 스크립트는 Ubuntu에서 잘못된 대체 오류를 발생시킵니다. 도움을 주시면 감사하겠습니다.



답변

/bin/sh우분투 아래 의 기본 쉘 ( )은 dash아닌을 가리 킵니다 bash.

me@pc:~$ readlink -f $(which sh)
/bin/dash

따라서을 사용 chmod +x your_script_file.sh하여 실행하거나을 사용하여 ./your_script_file.sh실행하면 bash your_script_file.sh제대로 작동합니다.

sh your_script_file.shhashbang 행이 무시되고 스크립트가 dash해당 문자열 대체 구문을 지원하지 않는 로 해석되므로이 스크립트를 실행하면 작동 하지 않습니다.


답변

나는 같은 문제가 있었다. 스크립트에없는 것이 있는지 확인하십시오

#!/bin/sh 

스크립트 상단에 대신에

#!/bin/bash


답변

여기에 도착하는 다른 사람들에게는 명령에 env 변수 구문을 사용할 때 정확한 메시지가 ${which sh}아닌 정확한 메시지가 나타납니다.$(which sh)


답변

스크립트 구문은 유효한 bash이며 좋습니다.

실패의 가능한 원인 :

  1. 당신 bash은 실제로 bash가 아니지만 kshbash의 매개 변수 대체를 이해하지 못하는 다른 쉘입니다. 스크립트가 잘 보이고 bash와 함께 작동하기 때문입니다. 수행 ls -l /bin/bash하고 정말 bash에 그리고 다른 쉘에 연결된 SYM 확인하세요.

  2. 시스템에 bash가 있으면 스크립트를 잘못된 방식으로 실행할 수 있습니다. ksh script.sh또는 sh script.sh기본 쉘은 bash가 아닙니다. 당신은 적절한 shebang을 가지고 있기 때문에, bash가 ./script.sh있거나 bash ./script.sh괜찮다면.


답변

스크립트를 실행 파일로 실행하는 대신 bash 명령을 사용하여 명시 적으로 스크립트를 실행하십시오.


답변

또한 스크립트의 첫 줄에 빈 문자열이 없는지 확인하십시오.

#!/bin/bash, 스크립트의 첫 번째 줄 인지 확인하십시오 .


답변

귀하의 예와 관련이 없지만 Bad substitutionBash가 인식하지 못하는 대체 구문에 대해 Bash에서 오류가 발생할 수도 있습니다 . 이것은 다음과 같을 수 있습니다 :

  • 길쭉한 공백. 예 :bash -c '${x }'
  • 오타. 예 :bash -c '${x;-}'
  • 최신 Bash 버전에 추가 된 기능입니다. 예 bash -c '${x@Q}'를 들어 Bash 4.4.

동일한 식에 여러 개의 치환이있는 경우 Bash는 문제가있는 식을 정확히 찾아내는 데 큰 도움이되지 않을 수 있습니다. 예 :

$ bash -c '"${x } multiline string
$y"'
bash: line 1: ${x } multiline string
$y: bad substitution