什么`$ {1#* =}`在Bash中意味着什么?

时间:2015-07-09 02:41:32

标签: arrays bash variables syntax associative-array

我在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个键值

离开=。这意味着什么?这是否表示您希望#*表示关联数组的键和值?

2 个答案:

答案 0 :(得分:8)

代码段${1#*=}与关联数组无关。 (Bash的语法非常一致,并且完全没有混淆) *

这是函数或脚本的第一个参数(${1})的值的模式匹配。它的语法是

${variable#glob}

,其中

  • variable是任何bash变量
  • glob是要匹配的任何glob模式(受路径名扩展决定)

它从线的开头开始抓住最短的比赛。 还有##从变量的开头开始抓取最长的匹配,%,从最后开始抓取最短的匹配,以及%%,它抓住最长的匹配开始从最后开始。

因此,例如,以下代码:

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)已删除。如果   参数为'@'或'',应用模式删除操作   每个位置参数依次,扩展是结果   名单。如果参数是使用'@'或''下标的数组变量,   模式删除操作应用于数组的每个成员   反过来,扩展是结果列表。