具有多行错误消息的 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: *
    

相关内容