Bash替换:如果丢失则出错,如果存在则重新映射

时间:2019-04-05 00:56:23

标签: bash

我想做这样的事情,但是要巧妙:

var=${1:?This is an error:+--arg ${1}}

这不是有效的语法,但基本上,如果有人通过$1作为foo,我希望var成为--arg foo,但如果他们不愿意,我希望错误。

有聪明的方法吗?

2 个答案:

答案 0 :(得分:2)

您不需要两个测试,只需对错误测试使用简单的分配即可:

var="--arg ${1:?This is an error}"

如果传递了$1,则会将其(带有前缀“ --arg”)分配给变量;如果未通过,则会显示错误并退出(因此不会发生分配)。

顺便说一句,您似乎正在尝试将多个参数(存储到其他程序中)存储在一个普通变量中。这是不安全的,因为$1可能包含空格和/或通配符,如果您引用的变量没有双引号(someprogram $var),它将在所有空白和任何通配符上拆分将扩大。另一方面,如果双引号,则--arg部分将作为同一参数的一部分传递。而是使用数组安全地存储多个值:

arrayvar=("--arg" "${1:?This is an error}")
someprogram "${arrayvar[@]}"

答案 1 :(得分:0)

您不能结合使用多个参数扩展运算符。

分两个步骤进行。首先检查错误,然后进行串联。

: ${1:?This is an error}
var="-arg $1"