Ответ Юку работает, только если вы единственный пользователь своего скрипта, в то время как ответ Денниса Уильямсона великолепен, если вы в основном заинтересованы в печати строк и ожидаете, что они не будут иметь кавычек в кавычках.
Вот версия, которую можно использовать, если вы хотите передать все аргументы как один большой аргумент строки в кавычках в параметр -c
для bash
или su
:
#!/bin/bash
C=''
for i in "$@"; do
i="${i//\\/\\\\}"
C="$C \"${i//\"/\\\"}\""
done
bash -c "$C"
Таким образом, все аргументы заключаются в кавычки (безвредные, если их не было раньше, для этой цели), но мы также экранируем все escape-последовательности, а затем экранируем любые кавычки, которые уже были в аргументе ( синтаксис ${var//from/to}
выполняет глобальную замену подстроки).
Конечно, вы можете цитировать только то, в чем уже есть пробелы, но здесь это не имеет значения. Одной из полезных функций такого скрипта является возможность иметь определенный предопределенный набор переменных среды (или, с помощью su, запускать что-то от имени определенного пользователя, без двойных кавычек).
Обновление: недавно у меня была причина сделать это способом POSIX с минимальным разветвлением, что привело к этому сценарию (последний printf выводит командную строку, используемую для вызова сценария, которую вы должны иметь возможность скопировать-вставить, чтобы вызвать с эквивалентными аргументами):
#!/bin/sh
C=''
for i in "$@"; do
case "$i" in
*\'*)
i=`printf "%s" "$i" | sed "s/'/'\"'\"'/g"`
;;
*) : ;;
esac
C="$C '$i'"
done
printf "$0%s\n" "$C"
Я переключился на ''
, поскольку оболочки также интерпретируют такие вещи, как $
и !!
в ""
-кавычках.
person
unhammer
schedule
04.01.2012
\"$@\"
неверен - он добавляет буквальные кавычки к первому и последнему аргументам."$@"
, без обратных слэшей, правильно: в нем кавычки чисто синтаксические. См. BashFAQ #50 для объяснения того, почему передача списков аргументов в виде строк изначально неверна в оболочке. . - person Charles Duffy   schedule 10.03.2017