遇到这段代码:
for entry in $(echo $tmp | tr ';' '\n')
do
echo $entry
rproj="${entry%%,*}"
rhash="${entry##*,}"
remoteproj[$rproj]=$rhash
done
所以我最初明白了#39 ;;'转换为新行,以便文件中的所有条目都在一个单独的行上。但是,我第一次看到这个:
rproj="${entry%%,*}"
rhash="${entry##*,}"
我确实理解这是在拍摄之前的所有事情,''在逗号之后,' 。但是,这比分裂更有效吗?另外,如果有人请解释语法,因为我无法将其与正则表达式或bash语法相关联。
答案 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)
对于表演来说,最好不要使用子弹来做事。我仍然对%和#感到困惑,但这些内部评估比使用sed
,cut
或perl
更好。
%%表示&#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将丢失。