Shell脚本中的动态变量分配

时间:2018-09-05 12:03:49

标签: bash shell

我在shell脚本方面非常新,并且在shell中获得了以下提到的变量导出:

export VAR_FILE=${*: -1}

有人无法帮助我理解这一点,因为我听不懂

2 个答案:

答案 0 :(得分:4)

好吧,让我们抓住bash manual然后去:

export variable[=value]-“标记要传递给环境中子进程的每个名称。”。这意味着,如果您从此外壳运行另一个进程(即,带有命令sh -c 'echo $variable'的子外壳),它将共享变量值。

$*-“($ *)从一个开始扩展到位置参数。”例如:sh -c 'echo $1' -- 1$1将扩展为“第一个位置参数”。因此$*扩展为所有位置参数。

${parameter:offset:length}-这称为“子字符串扩展”。它扩展为以offset开头的字符。如果参数为*@,则会超出位置参数,即:${*:2:1}等于$2。您还可以给出负偏移量​​,然后从背面开始计数。如果省略:length部分,则假定长度是无限的(到字符串的末尾,到最后一个位置参数)。

${*:-1}-如果您期望${parameter:-word}为空或未设置,则1会扩展为$*,这将无法正常工作。这意味着我们在:-之间需要一个空格,以便bash不会将子字符串扩展与:-混淆。

${*: -1}-这将为您提供最后的位置参数。即。 sh -c 'echo ${*: -1}' -- 1 2 3将输出3。

export VAR_FILE=${*: -1}-获取最后一个位置参数,将其分配给VAR_FILE变量,并设置VAR_FILE变量将被导出到子流程。

答案 1 :(得分:2)

$*是一个特殊的变量,它扩展到位置参数列表(脚本的参数),并用空格字符分隔。

${list: -1}扩展到列表的最后一个元素。

因此,这会将环境变量VAR_FILE设置为传递给脚本的最后一个参数。


请注意,对于您自己定义的数组,语法将有所不同:

list=( a b 'c d' )
export foo=${list[*]: -1} # list[*] instead of just *