
Как мне правильно написать это с помощью скрипта 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'
анализируется как
- литерал в одинарных кавычках
foo
- буквальный символ, заключенный в кавычки с обратной косой чертой
'
- литерал в одинарных кавычках
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