function foo() {
A=$@...
echo $A
}
foo bla "hello ppl"
Я хотел бы, чтобы вывод был:
"bla" "привет люди"
Что я должен сделать вместо замещающего знака?
Используйте подстановку параметра, чтобы добавить «в качестве префикса и суффикса:
function foo() {
A=("${@/#/\"}")
A=("${A[@]/%/\"}")
echo -e "${A[@]}"
}
foo bla "hello ppl" kkk 'ss ss'
Выходные данные
"bla" "hello ppl" "kkk" "ss ss"
У @msw есть правильная идея (выше в комментариях к вопросу). Однако, для печати аргументов с кавычками можно использовать другую идею: использовать неявную итерацию printf
:
foo() { printf '"%s" ' "$@"; echo ""; }
foo bla "hello ppl"
# => "bla" "hello ppl"
Цикл не требуется:
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"
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"
, что вам, вероятно, не нужно.
Вы можете использовать "$@" для обработки каждого параметра как, ну, отдельного параметра, а затем цикл над каждым параметром:
function foo() {
for i in "$@"
do
echo -n \"$i\"" "
done
echo
}
foo bla "hello ppl"