私は混乱して文の一部を削除することを忘れて、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
。
zsh
AT&Tの組み込み関数の場合、ksh
任意の算術式にすることができます(数値が予想されるほとんどの場合と同じです)。したがって1+1
、or 2は同じ意味です。A
算術式が で解決される値で$A
、$A
設定されていないか空の場合は 0 です。- GNU
printf
の組み込み関数は、printf
10進数、8進数、または16進数のリテラル定数のみを許可し(したがって、020、16、および0x10は同じであることを意味します)、先行(末尾ではない)スペースを無視してエラーメッセージを返します(ただしそうでない場合重要な位置にある定数を使用します)数字)引数の先頭に、または存在しない場合0)有効数字として認識されない場合。bash
dash
yash
組み込み機能はprintf
現在サポートされていません。%*s
だから:
printf '%*s%c' A B C
BC
inksh
およびzsh
Except 出力には、$A
整数部分がゼロ以外の数値として識別される算術式が含まれています。
$ A=5.2*2 zsh -c "printf '%*s%c' A B C"
BC
BC
bash
// 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