我在StackOverflow上发现了一个很棒的answer,它解释了如何将关联数组传递给函数。有人能够帮我弄清楚下面代码中${1#*=}
的语法是什么吗? (由answer借用jaypal singh}:
#!/bin/bash
declare -A weapons=(
['Straight Sword']=75
['Tainted Dagger']=54
['Imperial Sword']=90
['Edged Shuriken']=25
)
function print_array {
eval "declare -A arg_array="${1#*=}
for i in "${!arg_array[@]}"; do
printf "%s\t%s\n" "$i ==> ${arg_array[$i]}"
done
}
print_array "$(declare -p weapons)"
这是我到目前为止的猜测(如果我在其中任何一个方面出错了,请纠正我):
- 1
表示传递给函数的第一个参数($1
或${1}
)
- #
表示$1
的索引,由于$1
是关联数组,因此#
成为$1
的键
- *
表示关联数组#
中的$1
个键值
离开=
。这意味着什么?这是否表示您希望#
和*
表示关联数组的键和值?
答案 0 :(得分:8)
代码段${1#*=}
与关联数组无关。 (Bash的语法非常一致,并且完全没有混淆) *
这是函数或脚本的第一个参数(${1}
)的值的模式匹配。它的语法是
${variable#glob}
,其中
variable
是任何bash变量它从线的开头开始抓住最短的比赛。
还有##
从变量的开头开始抓取最长的匹配,%
,从最后开始抓取最短的匹配,以及%%
,它抓住最长的匹配开始从最后开始。
因此,例如,以下代码:
myVar="abc=llamas&disclaimer=true"
echo ${myVar#*=}
会将abc=
打印到屏幕上。
另一方面,
myVar="abc=llamas&disclaimer=true"
echo ${myVar##*=}
将打印abc=llamas&disclaimer=
和
myVar="foobar is bad"
echo ${myVar%%b*"
将打印bar is bad
* 这在bash man page中有详细解释;只需搜索字符串${parameter#word}
即可找到它
答案 1 :(得分:4)
它会删除由*=
评估的字符串中的模式$1
匹配的字符串(从开始时的最短匹配)。
$1
是传递给shell的第一个positional parameter。
一般格式也可以写为${var#patt}
,其中patt
匹配({1}}中匹配(最短匹配)并删除。
示例:
$var
输出:
var="first=middle=last"
echo "${var#*=}"
如果使用middle=last
代替##
,#
,则${var##pat}
匹配最长匹配(从开始)。
示例:
pat
输出:
var="first=middle=last"
echo "${var##*=}"
<小时/> From Bash Manual:
$ {parameter#word}
$ {参数##字}
这个词被扩展为产生一个模式,就像文件名扩展一样 (请参阅文件名扩展)。如果模式匹配的开头 扩展参数值,然后扩展的结果是 用最短匹配模式扩展参数值( '#'case)或最长匹配模式('##'case)已删除。如果 参数为'@'或'',应用模式删除操作 每个位置参数依次,扩展是结果 名单。如果参数是使用'@'或''下标的数组变量, 模式删除操作应用于数组的每个成员 反过来,扩展是结果列表。