我在shell脚本方面非常新,并且在shell中获得了以下提到的变量导出:
export VAR_FILE=${*: -1}
有人无法帮助我理解这一点,因为我听不懂
答案 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 *