我正在使用带有错误消息的参数替换,例如${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>
也可以看看什么时候需要双引号?。
例如
$ 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>"
尽管显然不是通配符,例如
$ word=* $ username=${1:?$word} bash: 1: *