Gre*_*n23 3 arrays variables syntax bash associative-array
我在StackOverflow上找到了一个很棒的答案,它解释了如何将关联数组传递给函数.有人能够帮我弄清楚${1#*=}下面代码中的语法是什么?(从借来的答案被jaypal辛格):
#!/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)"
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止的猜测(纠正我,如果我错了任何这些):
- 1意味着传递给函数($1或${1})的第一个参数
- #意味着索引$1,因为$1是一个关联数组,使得#键$1
- *表示#关联数组中键的值$1
离开了=.这意味着什么?这是一种表明你想要的方式,#并且*是指关联数组的键和值吗?
该片段${1#*=}与关联数组无关.(Bash的语法非常一致,并且完全不会令人困惑)*
这是${1}函数或脚本的第一个参数()的值的模式匹配.它的语法是
${variable#glob}
Run Code Online (Sandbox Code Playgroud)
哪里
variable 是任何bash变量它从线的开头开始抓住最短的比赛.还有一个##从变量的开头开始抓取最长的匹配,从最后开始%抓取最短的匹配,并且%%从最后开始抓取最长的匹配.
因此,例如,以下代码:
myVar="abc=llamas&disclaimer=true"
echo ${myVar#*=}
Run Code Online (Sandbox Code Playgroud)
将打印abc=到屏幕上.
另一方面,
myVar="abc=llamas&disclaimer=true"
echo ${myVar##*=}
Run Code Online (Sandbox Code Playgroud)
将打印abc=llamas&disclaimer=,和
myVar="foobar is bad"
echo ${myVar%%b*"
Run Code Online (Sandbox Code Playgroud)
将打印 bar is bad
*这在bash 手册页中有详细解释; 只需搜索字符串${parameter#word}即可找到它
它将按*=评估的字符串中的模式删除匹配的字符串(从开始到最短的匹配)$1。
$1是传递给外壳的第一个位置参数。
通用格式也可以写成${var#patt},在其中patt匹配(从开始到最短的匹配)$var并删除。
例:
var="first=middle=last"
echo "${var#*=}"
Run Code Online (Sandbox Code Playgroud)
输出:
middle=last
Run Code Online (Sandbox Code Playgroud)
如果##使用代替#ie ${var##pat},则将pat匹配最长匹配(从开始)。
例:
var="first=middle=last"
echo "${var##*=}"
Run Code Online (Sandbox Code Playgroud)
输出:
last
Run Code Online (Sandbox Code Playgroud)
$ {parameter#word}
$ {parameter ## word}
单词被扩展以产生与文件名扩展相同的模式(请参见文件名扩展)。如果模式与参数的扩展值的开头匹配,则扩展的结果是具有最短匹配模式(“#”情况)或最长匹配模式(“ ##”情况)的参数扩展值已删除。如果参数是'@'或' ',则将模式删除操作依次应用于每个位置参数,并且扩展名是结果列表。如果parameter是下标为'@'或' ' 的数组变量,则将模式删除操作依次应用于数组的每个成员,并且扩展为结果列表。