Распечатать строку, включающую одинарные кавычки и другие специальные символы

Распечатать строку, включающую одинарные кавычки и другие специальные символы

Как мне правильно написать это с помощью скрипта AIX? Мне нужно написать эту команду в test.txt:

clock=$(prtconf -s | awk '{print $4,$5}')

Я попробовал эту команду:

print 'clock=$(prtconf -s | awk '{print $4,$5}')' > test.txt

Вывод, записанный в test.txt, дает мне:

clock=$(prtconf -s | awk {print ,})

Если я использую " "кавычки:

print "clock=$(prtconf -s | awk '{print $4,$5}')"

Это дает мне прямой доступ к:

clock=3612 MHz

Как мне решить эту проблему?

решение1

Самый простой способ сделать это — использовать одинарные кавычки '…'вокруг строки. Одинарные кавычки ограничивают литеральную строку, поэтому между ними можно поместить что угодно, кроме одинарной кавычки '. Чтобы вставить одинарную кавычку в строку, используйте последовательность из четырех символов '\''(одинарная кавычка, обратная косая черта, одинарная кавычка, одинарная кавычка).

Технически, нет способа поместить одинарную кавычку внутрь литерала в одинарных кавычках. Однако последовательные литералы так же хороши, как и один литерал. 'foo'\''bar'анализируется как

  1. литерал в одинарных кавычкахfoo
  2. буквальный символ, заключенный в кавычки с обратной косой чертой'
  3. литерал в одинарных кавычкахbar

Фактически это означает, что '\''это способ экранировать одинарную кавычку в литерале, заключенном в одинарные кавычки.

Обратите внимание, что команда ksh printвыполняет расширение обратной косой черты. Добавьте -rопцию, чтобы избежать этого. Это не повредит вам, поскольку в строке, которую вы хотите вывести, обратной косой черты нет, но лучше использовать -r, на случай, если обратная косая черта будет добавлена ​​во время обслуживания.

print -r -- 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

В качестве альтернативы можно использовать метод POSIX, чтобы напечатать строку буквально с новой строкой в ​​конце:

printf '%s\n' 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

решение2

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

Для второго варианта:

print "clock=\$(prtconf -s | awk '{print \$4,\$5}')" > test.txt

Во-первых:

print 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

(Это 'text'затем экранированная одинарная кавычка \'затем 'other text'.)

Для полноты картины отметим, что printрасширяет escape-последовательности с символами обратной косой черты (в вашем случае это не имеет значения, поскольку строка, которую вы хотите вывести, не содержит никаких обратных косых черт). Чтобы избежать этого, используйте print -r.

решение3

Второе решение есть, как сказал @Mat.

1] Использование одинарных кавычек ': эта одинарная кавычка удаляет специальное значение экранированных символов, $различных команд (в основном всех конструкций bash и команд unix). printКоманда воспринимает все как обычные символы и записывает это в файл.test.txt

2] Использование двойных кавычек ": здесь нам нужно явно экранировать конструкции bash. \$удаляет специальное значение $, т. е. значение переменной, используемой после $.

решение4

Почему бы просто не использоватьздесь документ?

cat <<'END' > test.txt
clock=$(prtconf -s | awk '{print $4,$5}')
END

Обратите внимание на кавычки вокруг END: <<'END'они означают, что текст в следующих строках (до ENDмаркера) будет использоваться буквально. С помощью просто будет выполнено <<ENDрасширение доллара (т.е. $(command)или ).$variable

Связанный контент