bash特定语法的解释

时间:2015-05-26 06:39:30

标签: bash

遇到这段代码:

for entry in $(echo $tmp | tr ';' '\n')
do
echo $entry
  rproj="${entry%%,*}"
  rhash="${entry##*,}"
  remoteproj[$rproj]=$rhash
done

所以我最初明白了#39 ;;'转换为新行,以便文件中的所有条目都在一个单独的行上。但是,我第一次看到这个:

rproj="${entry%%,*}"
rhash="${entry##*,}"

我确实理解这是在拍摄之前的所有事情,''在逗号之后,' 。但是,这比分裂更有效吗?另外,如果有人请解释语法,因为我无法将其与正则表达式或bash语法相关联。

3 个答案:

答案 0 :(得分:5)

这些是string manipulation operators

${string##substring}
  

从$ string前面删除$ substring的最长匹配。

意味着它将删除第一个逗号之前的所有内容,包括它

${string%%substring}
  

从$ string后面删除$ substring的最长匹配。

意味着它将删除最后一个逗号之后的所有内容,包括它

顺便说一句,我会使用内部字段分隔符而不是tr命令:

IFS=';'
for entry in $tmp ; do
    echo $entry
    rproj="${entry%%,*}"
    rhash="${entry##*,}"
    remoteproj[$rproj]=$rhash
done
unset IFS

this

答案 1 :(得分:2)

使用read命令拆分行原始行并拆分每个条目。

IFS=';' read -r -a entries <<< "$tmp"
for entry in "${entries[@]}"; do
    IFS=, read -r rproj rhash <<< "$entry"
    remoteproj["$rproj"]=$rhash
done

答案 2 :(得分:1)

对于表演来说,最好不要使用子弹来做事。我仍然对%和#感到困惑,但这些内部评估比使用sedcutperl更好。
%%表示&#34;从变量内容的末尾删除最大可能的匹配字符串&#34;。
##表示&#34;从变量的内容&#34;中删除最大可能的匹配字符串。

您可以看到使用简单测试:

for entry in key,value a,b,c
do
   echo "$entry is split into ${entry%%,*} and ${entry##*,}"
done

分裂键的结果,值很明显。当您分割a,b,c时,字段b将丢失。