BASHの各パラメータに-oプレフィックスを追加します。

BASHの各パラメータに-oプレフィックスを追加します。

-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拡張の周囲に二重引用符を入れてください。拡張子の周りに二重引用符を使用または使用せずに、最も適切なものを確認してください。

関連情報