-p
関数に渡された各パラメータにプレフィックスを追加するには?
パラメータ自体を変更することも、新しい配列を作成することも可能です。
答え1
これは、空白がある場合やそれより悪い複雑なパラメータの場合でもうまく機能します。
#!/bin/bash
new_args=()
for arg
do
new_args+=( '-p' )
new_args+=( "$arg" )
done
for arg in "${new_args[@]}"
do
echo "$arg"
done
テスト:
$ ~/test.sh foo $'bar\n\tbaz bay'
-p
foo
-p
bar
baz bay
答え2
${ARGS[@]/#/-p }
変数を空の文字列に設定すると、拡張IFS
時に空白を保持できます。
# sample code
(
set -- 1 2 3 'arg with spaces' $'bar\n\tbaz bay'
printf 'oldIFS: %q\n' "$IFS"
IFS=""
#IFS=" "
printf 'newIFS: %q\n' "$IFS"
ARGS=("$@")
ARGS=( ${ARGS[@]/#/-p } )
for ((i=0; i < ${#ARGS[@]}; i++)); do
echo "$i: ${ARGS[i]}"
done
)
関数内でをIFS
使用して、変更された変数の範囲をその関数に制限できますdeclare IFS=""
。
答え3
パラメータを配列に入れて使用します。バッシュパターンの交換配列の置換と接頭辞の一致を実行します。
ARGS=("$@")
echo ${ARGS[@]/#/-p }
これにより、各パラメータの先頭がに置き換えられます-p<space>
。
残念ながら、パラメータにスペースがあると正しく機能しません。スペースは使用中は正しく保持されますが、ARGS=("$@")
拡張時には保持されません${ARGS[@]/#/-p }
。拡張の周りに二重引用符を追加できますが、2つで-p arg1
はなく1つのパラメータを取得します。
-p<space>
前に追加が必要ない場合は、-p
拡張の周囲に二重引用符を入れてください。拡張子の周りに二重引用符を使用または使用せずに、最も適切なものを確認してください。