Похоже, что ваша команда, возможно, устанавливает переменные окружения на основе аргументов, заданных в командной строке. Может быть, вы можете сделать:
CLUSTER=cl1; cluster=$CLUSTER command
... и установить среду для него при вызове.
В противном случае кавычки оболочки обычно разграничивают аргументы или экранируют другие специальные символы оболочки. Вы можете содержать (и, следовательно, избегать) различные типы кавычек в других видах, основываясь на различных правилах:
"''''"
- строка с мягкими кавычками может содержать любое количество жестких кавычек.
"\""
- \
обратная косая черта может экранировать "
мягкую кавычку внутри "
строки с мягкими кавычками.
- В этом контексте
\\
обратная косая черта также экранирует себя, \$
токен расширения и \n
намотки, как отмечено ниже, но в остальном трактуется буквально.
"${expand} and then some"
- строка в мягких кавычках может содержать интерпретированное $
расширение оболочки .
'"\'
- '
строка с жесткими кавычками может содержать любой символ, кроме '
жестких кавычек.
\
- обратная косая черта без кавычек будет экранирована от любого следующего символа для буквального толкования - даже от другой обратной косой черты - кроме \n
ewline.
- В
\\n
случае ewline и \
обратная косая черта, и \n
ewline полностью удаляются из полученной интерпретированной команды.
${parameter+expand "$parameter"}
- кавычки, возникающие в результате расширения оболочки, почти никогда не служат маркерами-разделителями, за исключением нескольких особых случаев. Я не рискну описывать это здесь дальше.
Я считаю странным, что любое приложение будет интерпретировать кавычки в своих аргументах командной строки. Такая практика не имеет большого смысла в этом - по крайней мере для оболочек - основная цель цитаты, как правило, заключается в разграничении аргумента. При вызове, однако, аргументы всегда уже разграничены с \0NUL
символами и поэтому цитаты не могут служить много целей.
Даже оболочка обычно интерпретирует кавычки только в одном из своих аргументов вызова, когда она вызывается с помощью -c
переключателя, что означает, что ее первый операнд на самом деле является сценарием оболочки, который должен запускаться при вызове. Это случай дважды оцененного ввода.
Все это говорит о том, что вы можете сделать несколько вещей, чтобы передать буквальные кавычки через аргументы командной строки. Например:
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"
Как я уже отмечал в комментарии ранее, вы можете содержать "
кавычки внутри расширения, которое само заключено в "
кавычки.
CLUSTER=cl1; command -p "cluster=\"$CLUSTER\""
Вы можете избежать "
с помощью \
обратной косой черты внутри "
строки в кавычках.
CLUSTER=cl1; command -p cluster='"'"$CLUSTER"'"'
Вы можете чередовать и объединять стили цитирования, чтобы получить желаемый конечный результат, как указано в примечаниях @jimmij выше .
CLUSTER=cl1; ( set -f; IFS=; command -p cluster=\"$CLUSTER\" )
Вы можете отключить как генерацию имени файла, так и $IFS
разбиение - тем самым $expansion
вообще избегая необходимости заключать в кавычки - и, таким образом, только заключать в кавычки. Это, вероятно, излишне.
Наконец, есть еще один тип кавычек, который можно использовать. Как я уже отмечал ранее, sh -c "$scriptlet"
форма вызова оболочки часто используется для предоставления сценария оболочки в командной строке. Когда это $scriptlet
усложняется - например, когда кавычки должны содержать другие кавычки - часто может быть выгодно использовать здесь-документ и sh -s
вместо этого - где оболочка специально проинструктирована назначать все последующие операнды позиционным параметрам, как это было бы в -c
случае и все же, чтобы взять его сценарий из stdin
.
Если ваша команда должна интерпретировать кавычки таким образом, я бы посчитал, что лучше это сделать при вводе файла. Например:
CLUSTER=cl1
command --stdin <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
Если вы не заключаете в кавычки разделитель, <<here-document
тогда все его содержимое обрабатывается почти точно так же, как они были заключены в "
мягкие кавычки, за исключением того, что "
сами двойные кавычки не обрабатываются специально. И так, если мы запустим выше с cat
:
CLUSTER=cl1
cat <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
... это печатает ...
cluster="cl1"
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"