bashで単一の変数に複数のパラメータを渡すには?

bashで単一の変数に複数のパラメータを渡すには?

2つのバージョンのPythonがインストールされています。したがって、pipを使用してパッケージをダウンロードする必要がある場合は、次のいずれかを使用する必要があります。

  1. python3.9 -m pip [args]
  2. python3.8 -m pip [args]

私が望むのは、私が実行したら適切なコマンドが実行されるようpip39に代わりに使用したいということです。pythin3.9 -mpip39 install somethingpip39 freeze

私は次の関数を書いた。

pip39(){python3.9 -m pip "$1"}

パラメータが1つだけなのでpip39 freeze動作します。freezeただし、pip39 install something2つのパラメータが渡され、bashは最初のパラメータのみを使用するため、エラーが発生します。

それでは、複数の引数を入れる方法は何ですか"$1"

答え1

Bourneなどのシェルでは、"$1"関数の最初の引数(または関数内で拡張されていない場合はスクリプトの最初の引数)に展開されます。空の文字列それ以外の場合は、2番目、3番目... 10番目に"$2"なり、指定されたすべての引数に展開されます。"$3""${10}""$@"

${1+"$1"}指定された場合は最初の引数に展開され、そうでない場合は任意のエントリ(空の文字列でもない)に展開されます。したがって、${1+"$1"} ${2+"$2"}関数の最初のパラメータは最大2つまで拡張されます。yashまたはシェルでは、、、およびでzsh単純化できます"${@[1,2]}"(またはで単純化することも"$@[1,2]"できますzsh)。ksh93bashzsh"${@:1:2}"

pip39() {python3.9 -m pip "$1"}はい扱いにくいところで文法。bash必要な他のBourne様シェルpip39() { python3.9 -m pip "$1";}(またはpip39() python3.9 -m pip "$1"bash、posh、yashではありませんが、BourneシェルとほとんどのBourne様シェル)に必要です。

したがって、ここでbash(質問にタグ付け)またはzsh(質問のコード構文)には、次のものが必要です。

pip39(){ python3.9 -m pip "$@";}

pip39すべての引数をに渡すと、python3.9コードはBourneおよびPOSIXと互換性があります。

または、限られた数のパラメータのみを渡します(ここでは3つを例として使用します)。

pip39(){ python3.9 -m pip "${@:1:3}"; } # ksh93, bash, zsh
pip39(){ python3.9 -m pip "${@[1,3]}"; } # zsh, yash
pip39(){ python3.9 -m pip ${1+"$1"} ${2+"$2"} ${3+"$3"}; } # any Bourne-like shell

1 Bourne シェルでない場合、9 つに制限されます。$10シェル類似${10}または${1}0シェル依存(残念ながらPOSIXでは後者を要求する)なので、避けるべきです。

関連情報