Bashのprintf組み込み機能では、一部の文字だけが誤った数字として扱われるのはなぜですか?

Bashのprintf組み込み機能では、一部の文字だけが誤った数字として扱われるのはなぜですか?

私は混乱して文の一部を削除することを忘れて、printf次のような結果を得ました。

# printf '%*s%c' {A..Z}
bash: printf: A: invalid number
bash: printf: D: invalid number
bash: printf: G: invalid number
bash: printf: J: invalid number
bash: printf: M: invalid number
bash: printf: P: invalid number
bash: printf: S: invalid number
bash: printf: V: invalid number
bash: printf: Y: invalid number
BCEFHIKLNOQRTUWXZ

なぜBCEFHIKLNOQRTUWXZ重要な数字と見なされますか?形式文字かもしれないからだと思ったが説明できないようですZ

これについてもっと読んで学ぶことができる場所はありますか?

システムメッセージ:

  • GNU bash、バージョン 4.4.12(1)-リリース(x86_64-unknown-linux-gnu)

ベストアンサー1

書式%*s仕様では、C のように 2 つのパラメータを使用します。 1つはパディング幅のもの、もう1つはパディングされる文字列のものです。

printf前のラウンドでパラメータを使用した後も引き続きパラメータが残っている場合、ユーティリティはその形式を再利用し続けます。

たとえば、次のように使用できます。

$ printf '%*s%c' 3 x1 '|' 4 y1  '|' 3 z1 "$NL" \
                 3 x2 '|' 4 y22 '|' 3 z2 "$NL"
 x1|  y1| z1
 x2| y22| z2

出力形式を列として指定します。動作は、これらの幅パラメータに期待される事項によって実装に依存しますprintf

  • zshAT&Tの組み込み関数の場合、ksh任意の算術式にすることができます(数値が予想されるほとんどの場合と同じです)。したがって1+1、or 2は同じ意味です。A算術式が で解決される値で$A$A設定されていないか空の場合は 0 です。
  • GNUprintfの組み込み関数は、printf10進数、8進数、または16進数のリテラル定数のみを許可し(したがって、020、16、および0x10は同じであることを意味します)、先行(末尾ではない)スペースを無視してエラーメッセージを返します(ただしそうでない場合重要な位置にある定数を使用します)数字)引数の先頭に、または存在しない場合0)有効数字として認識されない場合。bashdash
  • yash組み込み機能はprintf現在サポートされていません。%*s

だから:

printf '%*s%c' A B C

BCinkshおよびzshExcept 出力には、$A整数部分がゼロ以外の数値として識別される算術式が含まれています。

$ A=5.2*2 zsh -c "printf '%*s%c' A B C"
         BC

BCbash// GNUに出力されますが、有効な10進数/8進数/16進数リテラル定数ではないdashため、エラーメッセージも表示します。A

zshあるいは、ksh算術式が無効な場合はエラーメッセージが表示され、算術式が評価されている場所と同様に、誤った変数がある環境で任意のコマンドが実行される可能性があります。

$ A=1+ zsh -c "printf '%*s%c' A B C"
zsh:1: bad math expression: operand expected at end of string
BC
$ A='psvar[0$(uname>&2)]' zsh -c "printf '%*s%c' A B C"
Linux
BC

おすすめ記事