여러 줄 오류 메시지로 Bash 매개변수 대체

여러 줄 오류 메시지로 Bash 매개변수 대체

오류 메시지와 함께 매개변수 대체를 사용하고 있습니다 ${var1:?'some message'}. 예를 들어 여러 줄의 오류 메시지를 병합했습니다. 현재는 작은따옴표로 묶고 Enter 키를 사용하여 개행 문자를 삽입하는 경우에만 올바르게 작동합니다. 여러 줄을 허용하고 개별적으로 저장할 수 있는 현명한 방법이 있습니까?

나는 단지 탐구하고 싶어 호기심을 느꼈습니다. 직접적인 관련이 없는 한 if 문과 관련된 대체 구문을 제안하지 마십시오.

사례:

작동: 작은따옴표

needed=${1:?'first error line
second error line
third error line'}

작동하지 않음: 다른 문자열 변수 호출

usage_message='Please use this script by providing the following arguments:
1: <e.g user name>
2: <e.g run script>
3: <e.g something else>'

username=${1:?$usage_message}
run_script_path=${2:?$usage_message}
where_to_save=${3:?$usage_message}

작동하지 않음: 함수 호출

function get_message {
       echo -e "first line \nsecond line\nthird line"
       # or
       # printf "first line \nsecond line\nthird line"
}

needed=${1:? $(get_message)}

매개변수 대체에 대한 추가 논의: https://stackoverflow.com/a/77772942/13413319

답변1

하지만매개변수 확장을 위한 POSIX 표준이 문제에 대해서는 불분명하며 할당의 RHS는 bash 매개변수 확장이 수행되는 몇 안 되는 장소 중 하나입니다.아니요단어 분할 1은 일반적으로 수행됩니다 . 이 경우 단어 분할 2를 방지하려면 큰따옴표 여러 줄 변수 확장이 필요한 것 같습니다 . 그래서 비록

(인용되지 않음)

$ username=${1:?$usage_message}
bash: 1: Please use this script by providing the following arguments: 1: <e.g user name> 2: <e.g run script> 3: <e.g something else>

(선두)

$ username=${1:?"$usage_message"}
bash: 1: Please use this script by providing the following arguments:
1: <e.g user name>
2: <e.g run script>
3: <e.g something else>

당신은 또한 볼 수 있습니다언제 큰따옴표가 필요합니까?.


  1. 예를 들어

     $ var=foobar
     $ username=${var/bar/$usage_message}
     $ declare -p username
     declare -- username="fooPlease use this script by providing the following arguments:
     1: <e.g user name>
     2: <e.g run script>
     3: <e.g something else>"
    
  2. 분명히 와일드카드는 아니지만, 예를 들어

     $ word=*
     $ username=${1:?$word}
     bash: 1: *
    

관련 정보