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이며 양호합니다.
고장의 가능한 원인:
당신의.
bash
정는 bash 아지만니말,,ksh
bash 수대체 이하못셸 다른하 는지해 ▁because▁ ▁script의▁your 른▁bash▁with. 왜냐하면 의 스크립트는 괜찮아 bash와 함께 작동하기 때문입니다.왜냐하면 당신의 스크립트는 괜찮아 보이고 bash와 함께 작동하기 때문입니다. 도ls -l /bin/bash
그리고 그것이 정말로 bash이고 다른 셸과 연결되어 있지 않은지 확인합니다.다음과 같은 수
ksh script.sh
또는sh script.sh
기본 셸은 bash가 아닙니다.당신이 제대로 된 쉐방을 가지고 있기 때문에, 만약 당신이 bash를 가지고 있다면../script.sh
또는bash ./script.sh
괜찮을 겁니다.
스크립트를 실행 파일로만 실행하지 말고 bash 명령을 사용하여 명시적으로 실행해 보십시오.
또한 스크립트의 첫 줄에 빈 문자열이 없는지 확인합니다.
예를 들어, 확실하게 하라#!/bin/bash
스크립트의 첫 번째 줄입니다.
당신의 예와 관련이 없지만, 당신은 또한 얻을 수 있습니다.Bad substitution
Bash에서 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
'programing' 카테고리의 다른 글
T-SQL을 사용하여 MD5 해시 문자열 생성 (0) | 2023.05.27 |
---|---|
배열에서 중복 값을 찾아 반환하는 방법 (0) | 2023.05.27 |
마이크로소프트를 구성합니다.사용자 이름으로 전자 메일 주소를 허용하는 AsNet.Identity (0) | 2023.05.27 |
express.js에서 HTTPS 사용 (0) | 2023.05.22 |
Python Pandas:열이 특정 값과 일치하는 행 색인 가져오기 (0) | 2023.05.22 |