1

(curlとcutを使用して)値をフェッチし、それらからファイル名を作成するbash関数があります。ここで、別のパラメーターのセットを必要とする2番目の命名スキームをサポートしたいと思います。

例:

#!/bin/bash

TEMPLATE="%02i. %s.txt"

foo() {
    a="Imagine these to"
    b="be set dynamically"
    c="42"

    filename="$(printf "$TEMPLATE" "$c" "$a")"
    # second: filename="$a - $b.txt"
    # or:     filename="$(printf "%s - %s.txt" "$a" "$b")"
    echo "$filename"
    # generate file
}

# actual script loops over:
foo

値の1つは、必要に応じて先行ゼロで埋める必要がある数値です。したがってprintf、現在の実装ではそうです。

別のテンプレートをグローバルに設定するだけでこれを実装する方法はありますか?これには、テンプレートがインデックスによってパラメータにアクセスできるか、少なくとも一部をスキップできる必要があります。

そうでない場合、私の選択肢は何ですか?テンプレートはコマンドラインパラメータで選択され、初期化後に変更されません。

動作しないもの:

  • bashのマニュアルページは、長さゼロの出力は不可能であることを示唆しています(値をスキップするため)
  • Cのprintfのマニュアルページには「%m $」構文が記載されていますが、これは明らかにbashではサポートされていません。
  • 関数自体が値を生成するため、パラメーターとして完全なファイル名を受け取ることはできません
4

1 に答える 1

6

引数をスキップする必要がある場合は、を使用できます%.s。例:

$ printf "%.s%s\n" "Bonjour" "Hello"
Hello
$ printf "%s%.s\n" "Bonjour" "Hello"
Bonjour

AFAIK、インデックスで引数にアクセスすることはできません。

フォーマットされた文字列を変数に格納する必要がある場合は、次のようにサブシェルを使用しないでください。

$ variable=$(printf "%.s%s" "Bonjour" "Hello")
$ echo "$variable"
Hello

代わりに、次のように(詳細を入力するには)-vオプションを使用します。printfhelp printf

$ printf -v variable "%.s%s" "Bonjour" "Hello"
$ echo "$variable"
Hello

また、テンプレートがユーザー入力から取得できる場合は、--その直前に追加することをお勧めします(これは、ユーザーがダッシュでテンプレートを開始したい場合に備えて、コマンドのオプションを終了するためです)。したがって、私はあなたのラインを置き換えます

filename="$(printf "$TEMPLATE" "$c" "$a")"

printf -v filename -- "$TEMPLATE" "$c" "$a"

最後に、大文字の変数名を持つことは、bashの悪い習慣と見なされます。

于 2012-11-27T09:59:09.607 に答える