Да, является, и он также является оператором сравнения, в зависимости от того.
он появляется: как и во многих других языках, значение лексем зависит от
контекста. Bash поддерживает как присваивание, в форме name=[value]
,
и сравнение, используя языки выражений для test
(также известные как
как [
) и [[
; в них =
имеет другое значение.
${x+X}
?Bash поддерживает синтаксис ${параметр:+слово}
:
Использовать альтернативное значение. Если
параметр
равен нулю или не задан, ничего не будет подставляется, в противном случае подставляется расширениеword
.
В вашем случае это означает, что если x
не задан, то выражение
расширится до пустой строки (сравнение с X
будет неудачным),
а если оно установлено, то оно расширится до X
(сравнение даст
true).
Синтаксис ${параметр+слово}
является вариацией ${параметр:+слово}
,
с небольшим отличием, когда параметр
установлен, но пуст:
x ${x+alt} ${x:+alt}
------------ ---------- ----------
unset '' ''
set to '' alt ''
non-empty alt alt
Вы можете сделать это, просто расширив параметры оболочки :Это действительно один -лайнер
poem='foo bar, foo bar, foo bar
foo bar'
traits=( "is super" "is blazing fast" "is marvelous" "cawabanga" )
for trait in "${traits[@]}"; do poem=${poem/bar/"superman $trait"}; done
echo "$poem"
foo superman is super, foo superman is blazing fast, foo superman is marvelous
foo superman cawabanga
Я только что попробовал с простым содержимым массива. вы можете применить ту же логику для своего вопроса
$ declare -a var=(A B C D)
$ cat test.txt
foo bar, foo bar, foo bar
foo bar
$ awk -vArr="${var[*]}" 'BEGIN {split(Arr,awk_arr," ")}{for(i=1;i<=NF;i++)if($i~/bar/){count++;$i=awk_arr[count]}}1' test.txt
foo A foo B foo C
foo D