Bash 스크립트의 문자열 대체 "잘못된 대체"

Bash 스크립트의 문자열 대체 "잘못된 대체"

Bash 스크립트에서 기본 문자열 교체를 시도합니다.

#!/bin/bash
x="I love Linux"
echo "${x/Linux/Unix}"

내 Mac에서는 제대로 작동하지만 내 서버에서는 작동하지 않습니다. 여러 웹사이트에서 다양한 예를 시도했지만 항상 오류가 발생합니다. Bad substitution

내 배쉬 버전:GNU bash, Version 4.4.12(1)-release (x86_64-pc-linux-gnu)

내가 뭘 잘못했나요?

답변1

echo "${x/Linux/Unix}"이는 1996년에 출시된 버전 2.0 이후 bash의 올바른 구문입니다.

Bash는 정확한 오류 메시지를 표시하지 않습니다 Bad substitution. 유사해 보이지만 완전히 동일하지 않은 항목(예: 매개변수 대체)을 발견하면 메시지가 약간 다릅니다.

$ bash -c '${}'
bash: ${}: bad substitution

반면에 대시( /bin/sh많은 Linux 시스템에서 구현됨)는 다음과 같은 정확한 메시지를 발행합니다.

$ dash -c 'echo "${x/Linux/Unix}"'
dash: 1: Bad substitution

이 오류는 다음을 암시하기에 충분합니다.쿠사로난다가 언급했듯이sh, 실제로 이 스크립트를 프로그램으로 실행하는 것이 아닙니다. 일부 프로그램( 또는 ) 을 실행하고 /bin/sh이 스크립트를 실행하도록 지시하는 것입니다. 귀하의 스크립트는 올바른 bash 프로그램이지만 올바른 sh 프로그램은 아니므로 sh가 다른 방언이고 bash와 동일한 기능 세트가 없는 시스템에서는 스크립트가 실행되지 않습니다.

귀하의 스크립트는 독립형 프로그램입니다. 이것셰르본스크립트 상단의 줄은 사용할 인터프리터를 시스템에 알려줍니다. 스크립트를 실행하려면 해당 경로나 파일 이름을 입력하기만 하면 됩니다(명령어 검색 경로( )에 있는 경우 $PATH). 다른 실행 프로그램과 마찬가지로 스크립트(shebang 라인 포함)이든 비스크립트(커널 자체에서 실행되는 바이너리1 ) 이든 실행 권한( chmod +x path/to/script)이 필요합니다. 어떤 이유로 독립 실행형 프로그램이 아닌 스크립트가 있고 이를 bash로 실행하려는 경우 bash path/to/script대신 해당 스크립트를 실행하세요 sh path/to/script.

1 또는 Linux의 binfmt_misc 메커니즘과 같이 파일 실행 방법을 전달하는 다른 방법을 사용합니다.

관련 정보