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

Скажем, у меня есть следующие функции 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] )