Как использовать переменные внутри одинарных кавычек

У меня есть приложение, которое принимает в качестве входных атрибутов в двойные кавычки, встроенные в одинарные кавычки. Возьмем, к примеру, эту правильную команду:

command -p 'cluster="cl1"' 

Чтобы автоматизировать его, я создал файл bash с использованием $CLUSTER в качестве переменной. Как должна быть моя команда? Другими словами, что я должен положить вместо cl1?

Обратите внимание: если я изменил указанную выше команду, она не будет принята. Например: command -p "cluster=cl1" не принимается

  • Использование sed для замены строки специальными символами другой строкой со специальными символами
  • Запуск команд, хранящихся в переменных оболочки
  • Параметры Bash - Split
  • Проблема с использованием expr
  • Как положить $ @ в кавычки?
  • Петля над строкой в ​​zsh и Bash
  • Как работает опция -d для чтения bash?
  • Вывод аргумента в сценарии bash?
  • 2 Solutions collect form web for “Как использовать переменные внутри одинарных кавычек”

    Похоже, ваша команда, возможно, устанавливает переменные среды на основе аргументов, заданных ей в командной строке. Возможно, вы можете сделать:

     CLUSTER=cl1; cluster=$CLUSTER command 

    … и установить для него среду при вызове.

    В противном случае кавычки оболочки обычно ограничивают аргументы или исключают другие специальные символы оболочки из интерпретации оболочки. Вы можете содержать (и, следовательно, избегать) разные виды shell-кавычек в других видах, основанные на различных правилах:

    • "''''" – строка с мягким текстом может содержать любое количество жестких кавычек.
    • "\"" – a \ обратная косая черта может избежать " мягкой цитаты внутри " строки с мягким текстом.
      • В этом контексте \\ обратная косая черта также выходит из себя, токен \$ расширения и \n ewlines, как указано ниже, но в противном случае обрабатывается буквально.
    • "${expand} and then some" – строка с мягким текстом может содержать интерпретируемое расширение оболочки $ .
    • '"\' – строка с жесткими кавычками может содержать любой символ, отличный от ' жесткой кавычки».
    • \ – некотируемая обратная косая черта сбегает от любого последующего символа для буквальной интерпретации – даже другой косой черты – за исключением \n ewline.
      • В случае с \\n ewline, как \ backslash, так и \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 вообще, и поэтому просто цитируйте кавычки. Это, вероятно, слишком много.

    Наконец, существует другой тип shell-quote, который может быть использован. Как я уже отмечал ранее, для вызова сценария оболочки в командной строке часто используется форма вызова оболочки shell-скрипта. Когда $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" 

    Как mikeserv писал (а):

      CLUSTER='"cl1"'; command -p "cluster=$CLUSTER" 

    «Double quote» каждый литерал, содержащий пробелы / метасимволы и каждое расширение: "$var" , "$(command "$var")" , "${array[@]}" , "a & b" . Используйте 'single quotes' для кода или литерала $'s: 'Costs $5 US' , ssh host 'echo "$HOSTNAME"' . Видеть
    http://mywiki.wooledge.org/Quotes
    http://mywiki.wooledge.org/Arguments
    http://wiki.bash-hackers.org/syntax/words

    Linux и Unix - лучшая ОС в мире.