Свяжите все аргументы и перенесите их с двойными кавычками

function foo() {
A=$@...
echo $A
}

foo bla "hello ppl"

Я хотел бы, чтобы вывод был:
"bla" "привет люди"

Что я должен сделать вместо замещающего знака?

18
задан codeforester 28 March 2018 в 20:16
поделиться

5 ответов

Используйте подстановку параметра, чтобы добавить «в качестве префикса и суффикса:

function foo() {
    A=("${@/#/\"}")
    A=("${A[@]/%/\"}")
    echo -e "${A[@]}"
}

foo bla "hello ppl" kkk 'ss ss'

Выходные данные

"bla" "hello ppl" "kkk" "ss ss"
6
ответ дан 30 November 2019 в 07:12
поделиться

У @msw есть правильная идея (выше в комментариях к вопросу). Однако, для печати аргументов с кавычками можно использовать другую идею: использовать неявную итерацию printf:

foo() { printf '"%s" ' "$@"; echo ""; }

foo bla "hello ppl"
# => "bla" "hello ppl"
24
ответ дан 30 November 2019 в 07:12
поделиться

Цикл не требуется:

foo() { local saveIFS=$IFS; local IFS='"'; local a="${*/#/ \"}"; echo "$a"\"; IFS=$saveIFS; }

Сохранение IFS не требуется в этом простом примере, особенно его восстановление непосредственно перед выходом из функции из-за того, что local используется. Однако я включил его на тот случай, если в функцию входят другие вещи, на которые может повлиять измененный IFS .

Пример выполнения:

$ foo a bcd "efg hij" k "lll mmm nnn " ooo "   ppp   qqq   " rrr\ sss
 "a" "bcd" "efg hij" "k" "lll mmm nnn " "ooo" "   ppp   qqq   " "rrr sss"
2
ответ дан 30 November 2019 в 07:12
поделиться

ninjalj имел правильную идею, но использование кавычек было странным, отчасти потому, что то, о чем просит ОП, на самом деле не лучший формат вывода для многих задач оболочки. На самом деле, я не могу понять, какая задача предполагается, но:

function quote_args {
   for i ; do
      echo \""$i"\"
   done
}

помещает свои аргументы в кавычках по одному в строку, что обычно является лучшим способом передачи другим программам. Вы получаете вывод в форме, которую вы не просили:

$ quote_args this is\ a "test really"
"this"
"is a"
"test really"

но ее можно легко преобразовать, и это идиома, которую предпочитает большинство вызовов shell:

$ echo `quote_args this is\ a "test really"`
"this" "is a" "test really"

но если он не проходит через еще один eval проход, лишние кавычки, вероятно, все испортят. То есть, ls "is a file" выведет список файлов is a file, а

$ ls `quote_args is\ a\ file`

попытается вывести список "is, a и file", что вам, вероятно, не нужно.

3
ответ дан 30 November 2019 в 07:12
поделиться

Вы можете использовать "$@" для обработки каждого параметра как, ну, отдельного параметра, а затем цикл над каждым параметром:

function foo() {
for i in "$@"
do
    echo -n \"$i\"" "
done
echo
}

foo bla "hello ppl"
3
ответ дан 30 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

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