2017-01-18 2 views
-2
#! /bin/sh 
arg=("${@/a/b}") 
arg=("${arg[@]/c/d}") 
echo $arg 
echo ${arg[@]} 

Как я бегу выше сценарий с различными аргументами, я получаю следующие результаты:Как понять следующий сценарий bash?

$ ./a.sh a 
b 
b 

$ ./a.sh a w 
b 
b w 

Сценарий замените «а» в споре с «Ъ».

Однако я смущен использованием «/», и я не понимаю выражения arg [@].

+0

Символ косой черты может быть синтаксисом для замены (не на 100% уверен) –

+1

Если скрипт использует массивы, shebang должен быть '#!/Bin/bash', а не' #!/Bin/sh'. – chepner

ответ

1
${arg[@]/c/d} 

Это расширяет все элементы массива arg[] и заменяет все вхождения с с д.

В Баш оболочки попробуйте следующее:

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

И посмотреть, что происходит

SUBSTRING ЗАМЕНА:

${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 
3

В расширения параметров, ${foo/a/b} заменяет первое вхождение a в значение foo с b. Для параметра @ он заменяет первое вхождение a в каждый позиционный аргумент с b, а расширение, как обычно, представляет собой ряд слов, соответствующих исходным аргументам.

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

arg=("${@/a/b}") представляет собой массив, элементы которого являются модифицированными позиционными аргументами. Оператор /, примененный к расширению массива, ведет себя так же, как и с [email protected]; в этом случае первое вхождение c в каждом элементе ${arg[@]} заменяется на d.

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

Наконец, $arg само по себе эквивалентно ${arg[0]}.

Смежные вопросы