concat () (
IFS=''
printf '%s\n' "$*"
)
Эта функция использует"$*"
(двойные кавычки важны ),который будет расширяться до одной строки со значениями позиционных параметров (аргументов ), объединенных со значением первого символа $IFS
в качестве разделителя.
Мы устанавливаем IFS
на пустую строку, что означает, что "$*"
будет расширяться на все аргументы, объединенные без разделителя.
Также обратите внимание, что мы защищаем остальную часть сценария оболочки от принятия измененного значения $IFS
, заключая его в подоболочку (... )
вместо обычного {... }
.
Вызов этой функции в другой функции может выглядеть как
other_func () {
printf '%s\n' "$( concat "$@" )"
}
или короче, без фактического вызова функции concat
:
other_func () {
( IFS=''; printf '%s\n' "$*" )
}
Чтобы удалить все пробелы в списке аргументов, используйте
printf '%s\n' "$*" | tr -d ' '
например,
concat_delete_sp () {
printf '%s\n' "$*" | tr -d ' '
}
Тестирование:
$ concat 1 2 3 "h h h" o o o
123h h hooo
$ concat_delete_sp 1 2 3 "h h h" o o o
123hhhooo
Для нескольких -ресурсов -быстрое -решение с подходом, основанным на вашем втором примере:
func(){
a=$@;echo ${a// /}
}
Таким образом вы удаляете абсолютно все пробелы. Но имейте в виду подход @kusalananda, если вы планируете иметь аргументы, содержащие пробелы.
В оболочке zsh
вы можете использовать флаг раскрытия параметра j:separator:
для объединения элементов массива с произвольным разделителем. Так что вы можете сделать:
concat=${(j::)argv}
или
concat=${(j::)@}
для объединения элементов массива $argv
или $@
без необходимости изменять глобальный параметр, например $IFS
.
Если нужно просто напечатать аргументы, с Bourne -вроде шеллов, всегда можно сделать:
concat() {
printf %s "$@" || return
[ "$#" -eq 0 ] || printf '\n' # empty output if no argument
}
Встроенная функция printf
функций bash
и zsh
также может сохранять результат в переменной с помощью:
printf -v variable %s "$@"
С оболочкой fish
вы можете использовать:
echo -s -- $argv
(печатает пустую строку, если $argv
— пустой список ).