如何理解以下bash脚本?

时间:2017-01-18 04:33:38

标签: bash shell

#! /bin/sh
arg=("${@/a/b}")
arg=("${arg[@]/c/d}")
echo $arg
echo ${arg[@]}

当我使用不同的参数运行上面的脚本时,我得到以下结果:

$ ./a.sh a
b
b

$ ./a.sh  a w
b
b w

该脚本取代了' a'在与' b'的争论中。

但是,我对使用' /'感到困惑,而且我不理解arg [@]的表达。

2 个答案:

答案 0 :(得分:3)

在参数展开中,${foo/a/b}会将a的{​​{1}}中的第一个foo替换为b。对于参数@,它将每个位置参数中的a的第一个替换为b,并且扩展通常是一系列的与原始论点相对应的单词。

$ set a ab ac
$ printf '%s\n' "$@"
aa
ab
ac
$ printf '%s\n' "${@/a/b}"
ba
bb
bc

arg=("${@/a/b}")是一个数组,其元素是修改后的位置参数。应用于数组扩展的/运算符的行为方式与$@相同;在这种情况下,c的每个元素中第一次出现的${arg[@]}被替换为d

$ printf '%s\n' "${arg[@]/c/d}"
ba
bb
bd

最后,$arg本身相当于${arg[0]}

答案 1 :(得分:1)

${arg[@]/c/d} 

扩展数组arg[]的所有元素,并将所有出现的c替换为d。

在bash shell中试试这个:

a=(this is some stuff)
echo ${a[0]}
echo ${a[1]}
echo ${a[@]}
echo "${a[@]/i/X/}"    

看看会发生什么

SUBSTRING REPLACEMENT

${string/substring/replacement}      - replace first match of substring

${string//substring/replacement}     - replace all matches of substring

${string/#substring/replacement}     - replace substring at front of string

${string/%substring/replacement}     - replace substring at tail of string