Объединение всех аргументов функции / удаление всех пробелов из переменной

Другой способ в bash , yash :

$ PS1="$PS1\n"
0
22.03.2019, 14:13
3 ответа
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
3
28.01.2020, 02:22

Для нескольких -ресурсов -быстрое -решение с подходом, основанным на вашем втором примере:

func(){
  a=$@;echo ${a// /}
}

Таким образом вы удаляете абсолютно все пробелы. Но имейте в виду подход @kusalananda, если вы планируете иметь аргументы, содержащие пробелы.

0
28.01.2020, 02:22

В оболочке 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— пустой список ).

0
28.01.2020, 02:22

Теги

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