私は複数の文字列を使用するbash関数を書いています。各文字列は別々の行に印刷されます。
ただし、変数は関数に渡される文字列の数に応じて適切に結合する必要がありますfrmt
。printf
print ()
{
case $1 in
h|-h|-\?|--help)
printf "Prints a text string.\n"
printf "\$1 TEXT Sentence to print.\n"
local -r f=0
;;
*)
local -r f=1
;;
esac
local -r frmt="%s\n"
printf $frmt "$@"
}
関数パラメータの数を使用して文字列を繰り返すという考えがありましたが、printf
実行されませんでした。
local -r frmt=$(printf '%s\n' $(seq $#))
答え1
パラメータの数に応じてフォーマット文字列を作成する必要はありません。
見積もりリンクトンプソン氏:
- これ滞在主張は必要に応じて再利用指定されたすべてのパラメータを変換します。たとえば、このコマンド
‘printf %s a b’
は‘ab’
。
テストコードを書きます。
このような作業をするときは、できるだけ分解し、そこからビルドフォームを入手してください。たとえば、あなたの場合:
テスト
#! /bin/bash -
test1() {
printf 'test1\n'
printf 'ARG: "%s"\n' "$@"
}
test2() {
printf 'test2\n'
shift
printf 'ARG: "%s"\n' "$@"
}
test3() {
printf 'test3\n'
printf '2-ARGS: "%s" "%s"\n' "$@"
}
test1 first a b "c d e"
printf '\n'
test2 first a b "c d e"
printf '\n'
test3 a b c d e
結果
test1
ARG: "first"
ARG: "a"
ARG: "b"
ARG: "c d e"
test2
ARG: "a"
ARG: "b"
ARG: "c d e"
test3
2-ARGS: "a" "b"
2-ARGS: "c" "d"
2-ARGS: "e" ""
これはアイデアを与えなければなりません
printf '%s\n' $(シーケンス $#)
local -r frmt=$(printf '%s\n' $(seq $#))
たとえば、次のような結果が発生します。
printf '%s\n' $(seq 3)
1
2
3
printf '%s\n' $(seq $#)
いつものように、テスト中のアイテムを最も低いコンポーネント(ここまたは実際に)に分類し、シェルseq $#
でテストします。