printfコマンドとの混乱?


13

echoコマンドを使用せずに、1つの印刷コマンドで次の3行を印刷する必要があります。そこで、printfコマンドを選択しました。次の3行です。

  Different characters can be represented and supported 
  in the print command, for example: 
  x-y, X+Y, –, +, <, >, %, $, #, &.

これまでに行ったことは次のとおりです。

   printf "
   Different characters can be represented and supported 
   in the print command, for example: 
   x-y, X+Y, –, +, <, >, %, $, #, &.
   "

しかし、3行目の '、'でbashエラーが発生しました。

だから誰もが私を啓発するでしょう。


ところで、printコマンドとコマンドには違いがありprintfます。
フリム

回答:


12

使用する方が良い:

printf "Different characters can be represented and supported\n\
in the print command, for example:\n\
x-y, X+Y, –, +, <, >, %%, $, #, &.\n"

他の人がここで言ったように、あなたはそのエラーを受け取ります。なぜなら、%特別でエスケープしなければならない文字のためです。

詳細についてはman 1 printf、を参照してください。


@Narwen私は、あなたが特別なキャラクターと遊ぶ必要があるときはいつも男を使うようにあなたに勧めます。人で検索するには、/your_string_to_search入力してEnterキーを押します。
ラドゥラディアナヌ

4
全体のポイントprintfは、その%キャラクターとそれが何をするかです!
カズ

14

%はの特殊文字ですprintf。それがエラーの原因です。としてエスケープする必要があり%%ます。

$二重引用符で囲まれている場合は、外側のシェルで置き換えることもできるため、それをエスケープする必要があります(\$)。通常、単一引用符を使用する方が簡単です。


5
ドル記号の後に特別なのは、その後に有効な変数名が続く場合のみです。
グレンジャックマン

1
$variableでなく、シェルに置き換えられprintfます。文字列を二重引用符で$はなく一重引用符で囲むと、シェルによって補間されず、に直接渡されprintfます。
フリム

@glennjackman有効な変数名が続いている場合(その変数が実際に定義されているかどうかに関係なく)$特別であることに加え{て、特別なパラメーターシンボル、または1つ以上の数字が続く場合も特別です。しかし、あなたが言っていることの基本的な考え方は正しいです。
エリアケイガン

9

これ%はprintfにとって特別なものです。フォーマット指定子の先頭の文字です。リテラルのパーセントが必要な場合は、使用します%%


9

代わりにコマンドechoを使用することを選択したコマンドの使用が許可されていない場合、それは少し驚きですprintf

どうしてcat

#!/bin/bash

cat<<'EOF'
Different characters can be represented and supported
in the print command, for example:
x-y, X+Y, –, +, <, >, %, $, #, &.
EOF

しかし、質問に応じてエコーを印刷コマンドに置き換える必要がありました。しかし、助けてくれてありがとう。
ナルウェン

2
$fooテキストのように文字列を解釈しないようにするcat <<'EOF'には、代わりにを使用しますcat <<EOF
-Lekensteyn

4

printfは、最初のパラメーターとしてフォーマット文字列をとるフォーマットされた印刷です。残りのパラメーターは、フォーマット文字列で使用されます。使用printfする際に覚えておくべき3つのことは次のとおりです。

  1. 多くの言語にはprintfステートメント/コマンド/関数がありますが、それらはすべて少し異なるため、言語固有のドキュメント(C、bash、php、perlなど)で詳細を常に確認してください。

  2. フォーマット文字列でユーザーが指定した情報を使用しないでください。これは常にセキュリティ上の欠陥です。ユーザーが指定した文字列を表示する場合は、次のような形式の文字列を使用します"%s"

  3. バックスラッシュ(\)とパーセント記号(%)は両方ともエスケープ文字であり、出力にエスケープ文字を表示したい場合、次の文字の意味を変更します。エスケープ文字をエスケープするか、別のパラメーターからプルする必要があります。ドル記号($)はprintfにとって特別なものではありませんが、シェルにとって特別なものなので、引用符に注意してください。

printf数値の書式設定に最適です。詳細については、manページをご覧ください


2

他の人が述べたように、%シンボルはのために特別ですprintf

文字列をそのまま出力する場合は、printf %s最初の引数としてto を指定し、2番目の引数として単一引用符で囲まれた文字列を指定します。

printf %s '
Different characters can be represented and supported 
in the printf command, for example: 
x-y, X+Y, –, +, <, >, %, $, #, &.
'

二重引用符の代わりに単一引用符を使用すると、シェルがのようなシンボルを補間するのを停止します$

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.