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
最も簡単な方法は、'…'
文字列の周りに一重引用符を使用することです。一重引用符はリテラル文字列を区切るため、一重引用符を除くすべての項目をそれらの間に入れることができます'
。文字列に一重引用符を挿入するには、4文字のシーケンス'\''
(一重引用符、バックスラッシュ、一重引用符、一重引用符)を使用します。
技術的には、一重引用符で囲まれたリテラルの中に一重引用符を入れることはできません。ただし、連続テキストは単一のテキストと同じくらい良いです。'foo'\''bar'
次のように解析されます。
- 一重引用符リテラル
foo
- バックスラッシュで囲まれたリテラル文字
'
- 一重引用符リテラル
bar
これが実際に意味するのは、これが'\''
一重引用符リテラル内で一重引用符をエスケープする方法であることです。
kshprint
コマンドはバックスラッシュ拡張を実行します。-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
引き続き一重引用符を使用する必要がありますが、出力で「別途」として必要な一重引用符を印刷するか、二重引用符を使用してドル記号をエスケープする必要があります。
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
バックスラッシュ文字エスケープシーケンスを拡張することに注意してください(印刷したい文字列にバックスラッシュが含まれていないため、これは問題ではありません)。これを防ぐためにprint -r
。
答え3
@Matが言ったように、2つの解決策があります。
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