Подготовить и добавить строку к каждому элементу $ *в оболочке

if — это ключевое слово оболочки. Вы можете либо завершить синтаксическую конструкцию, например, набрав then true ; fi, либо просто нажать control -c, чтобы вернуться к обычному приглашению.

5
22.07.2020, 16:21
3 ответа
#!/bin/bash
echo $*
FIELDS=("${@/#/x}")
FIELDS=("${FIELDS[@]/%/y}")
echo "${FIELDS[*]}"

При работе:

$ t.sh foo bar baz
foo bar baz
xfooy xbary xbazy
3
18.03.2021, 23:18

${var/pattern/replacement}— это оператор раскрытия параметра ksh93, также поддерживаемый zsh, mkshи bash, хотя с вариациями(mkshв настоящее время не может работать с массивами ).

кш93

В ksh93вы бы сделали ${var/*/x\0y}, чтобы добавить к расширению $varпрефикс xи суффикс yи ${array[@]/*/x\0y}, чтобы сделать это для каждого элемента массива.

Итак, для массива позиционных параметров:

print -r -- "${@/*/x\0y}"

(будьте осторожны, однако, как и для вашего ${*/#/x}, он глючит, когда список позиционных параметров пуст ).

зш

zshэквивалентен ksh93's \0для вызова совпадающей строки в замене $MATCH, но только если вы используете (#m)в шаблоне (, для которого вам нужен extendedglobопция):

set -o extendedglob
print -r -- "${@/(#m)*/x${MATCH}y}"

Но в zshвы можете вкладывать расширения параметров, так что вы также можете:

print -r -- ${${@/#/x}/%/y}

Хотя вы, вероятно, предпочтете использовать оператор $^array, который включает rcexpandparamдля расширения этого массива,заставить его вести себя как расширение фигурной скобки:

print -r -- x$^@y

Или вы можете использовать:

printf -v argv x%sy "$@"

Чтобы изменить$@(или $argvвzsh)в -, поместите (здесь, предполагая, что "$@"не является пустым списком).

баш

В оболочке bashвам, вероятно, потребуется сделать это в два этапа с промежуточным массивом, как , показанным @L.ScottJohnson , или изменить $@на месте с помощью:

set -- "${@/#/x}"
echo -E "${@/%/y}"

(здесь предполагается префикс(xв данном случае ), не начинается с-).

POSIXly

Вы можете изменить позиционные параметры в -месте с помощью цикла:

for i do
  set -- "$@" "x${i}y"
  shift
done
echo "$@"

(, однако имейте в виду, что echoнельзя использовать для переноса для отображения произвольных данных, которые могут содержать символы обратной косой черты или начинаться с-)

Примечание

Обратите внимание, что $*форма расширения параметра (, которая полезна только в кавычках ), предназначена для конкатенации позиционных параметров (с первым символом $IFS, SPC по умолчанию ). Вам снова нужно $@(, заключенное в кавычки ), чтобы расширить все позиционные параметры как отдельные аргументы. Без кавычек, $*и $@имеют мало смысла (, за исключением zsh, где они расширяются до не -пустых позиционных параметров ), так как они могут быть разделены + подстановка, и поведение варьируется между снаряды.

10
18.03.2021, 23:18

Учитывая список в$@
... распечатать

set -- foo bar baz
printf '%s\n' "$@"
foo
bar
baz

... выполнить операцию списка

set -- $(printf 'x%sy ' "$@")
printf '%s\n' "$@"
xfooy
xbary
xbazy

... строковый список

printf '%s\n' "$*"
xfooy xbary xbazy

Никаких специальных функций bash не задействовано.

2
18.03.2021, 23:18

Теги

Похожие вопросы