if
— это ключевое слово оболочки. Вы можете либо завершить синтаксическую конструкцию, например, набрав then true ; fi
, либо просто нажать control -c, чтобы вернуться к обычному приглашению.
#!/bin/bash
echo $*
FIELDS=("${@/#/x}")
FIELDS=("${FIELDS[@]/%/y}")
echo "${FIELDS[*]}"
При работе:
$ t.sh foo bar baz
foo bar baz
xfooy xbary xbazy
${var/pattern/replacement}
— это оператор раскрытия параметра ksh93, также поддерживаемый zsh
, mksh
и bash
, хотя с вариациями(mksh
в настоящее время не может работать с массивами ).
В 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
в данном случае ), не начинается с-
).
Вы можете изменить позиционные параметры в -месте с помощью цикла:
for i do
set -- "$@" "x${i}y"
shift
done
echo "$@"
(, однако имейте в виду, что echo
нельзя использовать для переноса для отображения произвольных данных, которые могут содержать символы обратной косой черты или начинаться с-
)
Обратите внимание, что $*
форма расширения параметра (, которая полезна только в кавычках ), предназначена для конкатенации позиционных параметров (с первым символом $IFS
, SPC по умолчанию ). Вам снова нужно $@
(, заключенное в кавычки ), чтобы расширить все позиционные параметры как отдельные аргументы. Без кавычек, $*
и $@
имеют мало смысла (, за исключением zsh
, где они расширяются до не -пустых позиционных параметров ), так как они могут быть разделены + подстановка, и поведение варьируется между снаряды.
Учитывая список в$@
... распечатать
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 не задействовано.