programing

bash : 잘못된 대체

skycolor 2023. 5. 27. 09:58
반응형

bash : 잘못된 대체

#!/bin/bash

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

이 bash 스크립트는 Ubuntu에서 잘못된 대체 오류를 표시합니다.어떤 도움이든 대단히 감사하겠습니다.

셸기본 셸(셸)/bin/sh의 )는 Ubuntu 아래가리다니킵다음을 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.sh는 해방라인무스다의가음해에작않해다동습니하지로로 해석되므로 .dash해당 문자열 대체 구문을 지원하지 않습니다.

저도 같은 문제가 있었습니다.스크립트에 다음이 없는지 확인합니다.

#!/bin/sh 

스크립트의 맨 위에 있습니다.대신, 당신은 추가해야 합니다.

#!/bin/bash

여기에때 이 . 를 들어, " env" " env" " env" " env" " env" " env" " " env" " env" " env" " env" " env" " " env" " " env" " env" " " " " env" " env"와 같은 메시지가 표시됩니다.${which sh} 정한대에 $(which sh)

스크립트 구문이 유효한 bash이며 양호합니다.

고장의 가능한 원인:

  1. 당신의.bash 정는 bash 아지만니말,,kshbash 수대체 이하못셸 다른하 는지해 ▁because▁ ▁script의▁your 른▁bash▁with. 왜냐하면 의 스크립트는 괜찮아 bash와 함께 작동하기 때문입니다.왜냐하면 당신의 스크립트는 괜찮아 보이고 bash와 함께 작동하기 때문입니다.ls -l /bin/bash그리고 그것이 정말로 bash이고 다른 셸과 연결되어 있지 않은지 확인합니다.

  2. 다음과 같은 수ksh script.sh또는sh script.sh기본 셸은 bash가 아닙니다.당신이 제대로 된 쉐방을 가지고 있기 때문에, 만약 당신이 bash를 가지고 있다면../script.sh또는bash ./script.sh괜찮을 겁니다.

스크립트를 실행 파일로만 실행하지 말고 bash 명령을 사용하여 명시적으로 실행해 보십시오.

또한 스크립트의 첫 줄에 빈 문자열이 없는지 확인합니다.

예를 들어, 확실하게 하라#!/bin/bash스크립트의 첫 번째 줄입니다.

당신의 예와 관련이 없지만, 당신은 또한 얻을 수 있습니다.Bad substitutionBash에서 Bash가 인식하지 못하는 모든 대체 구문에 대한 오류입니다.이는 다음과 같습니다.

  • 공백이 비어 있습니다.예.bash -c '${x }'
  • 타오예. 예o.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

bash 또는 dash 둘 다 작동하지만 구문은 다음과 같아야 합니다.

FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new

나는 bash에 곱슬곱슬한 중괄호가 있는 표현으로 달러 기호를 두 번 추가하고 있었습니다.

cp -r $PROJECT_NAME ${$PROJECT_NAME}2

대신에

cp -r $PROJECT_NAME ${PROJECT_NAME}2

이 문제가 표시된 답변으로 인해 발생했거나 bash 선언 앞에 줄이나 공백이 있습니다.

"+x"가 문제를 일으키는 것 같습니다.

root@raspi1:~# cat > /tmp/btest
#!/bin/bash

jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
root@raspi1:~# chmod +x /tmp/btest
root@raspi1:~# /tmp/btest
root@raspi1:~# sh -x /tmp/btest
+ jobname=job_201312161447_0003
/tmp/btest: 4: /tmp/btest: Bad substitution

나의 경우(Ubuntu 18.04에 따라), 나는 혼합했습니다.$( ${} )잘 작동합니다.

BACKUPED_NB=$(ls ${HOST_BACKUP_DIR}*${CONTAINER_NAME}.backup.sql.gz | wc --lines)

여기에 있는 완전한 .

사용한#!bin/bash모든 접근법을 시도한 것도 마찬가지입니다. 이전이나 이후에 라인이 없습니다.#!bin/bash.
그리고 +x도 사용해 보았지만 여전히 작동하지 않았습니다.마침내 나는 스크립트를 실행해 보았습니다../script.sh그것은 잘 작동했습니다.

#!/bin/bash
jobname="job_201312161447_0003"
jobname_post=${jobname:17}

root@ip-10-2-250-36:/home/bitnami/bitnami/bitnami/bitnami/bitnami/bitnami_bitnami_b
jaru.sh : 3: jaru.sh: 잘못된 대체

root@ip-10-2-250-36:/home/bitnami/bitnami/bitnami/bitnami/bitnami/bitnami_bitnam# ./jar
root@ip-10-2-250-36:/home/bitnami/bitnami/bitnami/bitnami/bots_bitnam#

언급URL : https://stackoverflow.com/questions/20615217/bash-bad-substitution

반응형