bugfix> bash > 投稿

これらの出力を以下に説明する方法は?なぜ2番目のコマンドが010を0008に置き換えますか? bashの中括弧構文で何が起こっているのか理解できなかったのかもしれません。

$ BN=CF001; echo `printf CF%04d.conllu ${BN/CF/}`
CF0001.conllu
$ BN=CF010; echo `printf CF%04d.conllu ${BN/CF/}`
CF0008.conllu

回答 3 件
  • bash を強制できます  値を基数10の数値として扱うには:

    $ BN=CF010
    $ printf '%04d\n' ${BN#CF}
    0008
    $ printf '%04d\n' $((10#${BN#CF}))
    0010
    
    

  • d を使用しているため   printf の修飾子(数値) 、それは 010 を解釈しています   0 で始まるため、8進数として 。

    8進数 010  は 8 です  10進数(基数10)。

    s を使用できます  正しい出力を得るには:

    BN=CF010; printf 'CF%04s.conllu\n' "${BN/CF/}"
    CF0010.conllu
    
    

  • 私が見つけた解決策は、@ anubhavaと同様に、 f の使用です :

    $ BN=CF010; echo `printf CF%04.f.conllu ${BN/CF/}`
    CF0010.conllu
    
    

あなたの答え