![特別な順序なしでprintfに引数を印刷します。](https://linux33.com/image/49023/%E7%89%B9%E5%88%A5%E3%81%AA%E9%A0%86%E5%BA%8F%E3%81%AA%E3%81%97%E3%81%A7printf%E3%81%AB%E5%BC%95%E6%95%B0%E3%82%92%E5%8D%B0%E5%88%B7%E3%81%97%E3%81%BE%E3%81%99%E3%80%82.png)
特別な順序なしでcoreutil
sのパラメータをどのように参照しますか?printf
私が避けたいものは次のとおりです。
$ printf '%s %s %s %s %s %s %s' a c a c b c a
a c a c b c a
これが私がしたいことです:
$ printf '%s %s³ %s¹ %s³ %s² %s³ %¹' a b c
a c a c b c a
これはPerlで実装されました。
perl -e 'printf ("%s %3\$s %1\$s %3\$s %2\$s %3\$s %1\$s\n", 'a', 'b', 'c');'
a c a c b c a
4つのパラメータのみが渡されますprintf
。
答え1
これを行うための組み込み方法が見つかりません。次のように、ループ内でいつでもパラメータを生成できます。
forループ
$ printf '[ -d %s ] || mkdir %s; cd %s\n' `for run in {1..3}; do echo "$dir";done`
若干異なる:
$ printf '[ -d %s ] || mkdir %s; cd %s\n' $(for run in {1..3}; do echo "$dir";done)
コマンドのこの部分を変更して引数の数を制御できます{1..3}
。
シーケンスとxargs
$ printf '[ -d %s ] || mkdir %s; cd %s\n' $(seq 1 3 | { xargs -i -- echo "$dir"; })
これは 1 から 3 までの一連の数字を生成し、 { xargs -i ... } が実行される回数を制御します。
はい
@riciのコメントのおかげで、次の設定を使用することもできますyes ... | head -n 3
。
$ printf '[ -d %s ] || mkdir %s; cd %s\n' $(yes "$dir" | head -n 3)
引用する
答え2
BashのPrintfはこのオプションを実装しません。
しかし、簡単な解決策は変数を使用することです。
$ a=a b=b c=c
$ printf '%s %s %s %s %s %s %s\n' "$a" "$c" "$a" "$c" "$b" "$c" "$a"
a c a c b c a
位置パラメータ図:
$ set -- a b c
$ printf '%s %s %s %s %s %s %s\n' "$1" "$3" "$1" "$3" "$2" "$3" "$1"
a c a c b c a