Intereting Posts
Как отображать аудио визуализацию в VLC во время воспроизведения видео? Использовать команду sed с переменными Правильная настройка операционной системы на зашифрованном диске LUKS с алгоритмом non-aes для дистрибутива на основе yum (CentOS) Как исключить тип файла в find, exec и grep? Подсчет файлов, каталогов и т. Д. В заданном каталоге и форматирование на экране Можно приостановить dd, поменять место назначения на более крупный диск и продолжить? Настройте УАТС для переадресации вызовов на мой телефон только в случае Преобразование xlsx в xls в сценарии оболочки Linux Переход на виртуальный терминал медленный Вредоносные процедуры открывают соединения с Китаем индивидуальный пейджер для Git почему «timer_t» определяется в «time.h» в Linux, но не OS X Как перейти к следующему или предыдущему слову с помощью клавиш CTRL + со стрелками в консоли? Как извлечь один файл из двух путей в unix? Определите, какой графический драйвер Xorg использует

сопоставить массив аргументов, а затем преобразовать в строку

Скажем, у меня есть следующие функции bash в скрипте:

foo(){ my_args_array=("$@") export my_args="${my_args_array[@]}" bar $my_args } bar(){ echo "number of args: $#"; } foo ab 'cde' 

если я запускаю приведенный выше скрипт, я получу:

количество аргументов: 5

но то, что я ищу, это:

количество аргументов: 3

поэтому мой вопрос – есть ли способ отобразить значение, возвращаемое my_args_array[@] , чтобы я мог my_args_array[@] каждый элемент в одинарные кавычки? Или сделайте все, что мне нужно, чтобы строка переменной env выглядела как исходные аргументы командной строки.

    Используйте массив, а не строку:

     #!/bin/bash foo(){ my_args=("$@") bar "${my_args[@]}" } bar(){ echo "number of args: $#"; } foo ab 'cde' 

    В Bash использование "${array[@]}" (или "$@" ) в правой части назначения работает примерно так же, как ${array[*]} (или "$*" ): оно присоединяется к массив элементов в одну строку, используя пробелы в качестве разделителей. ( ${array[*]} ( "$*" ) использует первый символ (байт?) IFS .) Это также относится к аргументам export , declare , local и т. д.

    Тогда у вас есть my_args в my_args , и расширение без my_args разделяется.

    Если вы хотите массив, используйте массив:

     foo() { bar "$@" } bar() { echo "number of args: $#"; } foo ab 'cde' 

    Или, если вам нужна строка, вероятно, для ясности лучше явно использовать "${array[*]}" .

    (FWIW, Bash не поддерживает экспорт массивов через среду [1] [2] )