printfのダッシュ


37

私はprintfを使用してbashスクリプトでかなりの出力をフォーマットしようとしています

例えば:
-----------------------
| This is some output |
-----------------------

しかし、私は理解できないいくつかの行動につまずいた。

$ printf "--" 私にエラーを与えます printf: usage: printf [-v var] format [arguments]

そして $ printf "-stuff"結果-bash: printf: -s: invalid option

したがって、printfは、私が引数を渡そうとしているのに、渡していないと考えているようです。

その間、完全に偶然に、この回避策を見つけまし
$ printf -- "--- this works now ----\n"た。--- this works now ----

誰でもこの動作を説明できますか?



インタレストのうち、実行echo時に失敗する実装はありますecho ------------か?ほとんどの場合-n(末尾の改行なし)、-e(バックスラッシュでエスケープされた文字を-E解釈する)、可能な(解釈しない)だけであり、他のオプションのような引数に遭遇してもエラーになりませんか?(編集:GNU /bin/echoもサポート--help--versionます。)
janmoesen

回答:


44

--何でも、次が必要があることを伝えるプログラムするために使用されていないコマンドラインとして解釈するオプションにしますprintf

編集:したがって、printf "--"あなたは基本的に「引数のないprintf」として終了し、したがって失敗しました。


19
つまり、印刷--するにはを実行できますprintf -- --
l0b0

2
...とprintf --同じprintfです(同じメッセージが表示されます)
-Peter.O

printf -- $fmtポータブルではないことに注意してください。busybox 1.30.1では、がprintf -- '%s\n' hello生成され--ます。参照:pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
kelvin

25

-- はオプションとして解釈されています(この場合、これ以上オプションがないことを示します)。

誤った解釈を防ぐために使用するときは、フォーマット文字列を常に含める必要がありますprintf。特定の場合:

printf '%s\n' '-----------------------'

シーケンスでこれを行う必要がある場合はどうですか?printf '-%.0s' {1..54}
qodeninja

2
@qodeninjaその後、実際に使用たいのです--:-)printf -- '-%.0s' {1..54}
クリスダウン

4

printf builtinと/ usr / bin / printfには違いがあります。2番目の方法は、これらの迷惑なエラーを発生させることなく「あなたが言っていること」を行います。

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