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

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

离开了=.这意味着什么?这是一种表明你想要的方式,#并且*是指关联数组的键和值吗?

jpa*_*ugh 8

该片段${1#*=}与关联数组无关.(Bash的语法非常一致,并且完全不会令人困惑)*

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

${variable#glob}
Run Code Online (Sandbox Code Playgroud)

哪里

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

它从线的开头开始抓住最短的比赛.还有一个##从变量的开头开始抓取最长的匹配,从最后开始%抓取最短的匹配,并且%%从最后开始抓取最长的匹配.


因此,例如,以下代码:

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}即可找到它


Jah*_*hid 5

它将按*=评估的字符串中的模式删除匹配的字符串(从开始到最短的匹配)$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)


从Bash手册

$ {parameter#word}

$ {parameter ## word}

单词被扩展以产生与文件名扩展相同的模式(请参见文件名扩展)。如果模式与参数的扩展值的开头匹配,则扩展的结果是具有最短匹配模式(“#”情况)或最长匹配模式(“ ##”情况)的参数扩展值已删除。如果参数是'@'或' ',则将模式删除操作依次应用于每个位置参数,并且扩展名是结果列表。如果parameter是下标为'@'或' ' 的数组变量,则将模式删除操作依次应用于数组的每个成员,并且扩展为结果列表。