0

多数の引数を持つシェル スクリプトを呼び出しています./train-rnn.sh 0 0 0 "63 512"。各引数を特定の位置パラメータに割り当てることは可能ですか? 例えば

./train-rnn.sh $1=0 $2=0 $4=0 $3="63 512"

4

1 に答える 1

1

Bash にはそのためのメカニズムはありませんが、何かを調理することはできます。

最善の方法は、スクリプト内のコマンド ライン引数を解析することです。option=argumentその場合、ユーザー (および開発者も!) に 、 などの意味を覚えてもらう代わりに$1、フォームのオプションを許可することで、ユーザー エクスペリエンスを向上させたい場合があります$2

#! /usr/bin/env bash
declare -A opt
for arg; do
  if [[ "$arg" =~ ^([^=]+)=(.*) ]]; then
    opt["${BASH_REMATCH[1]}"]=${BASH_REMATCH[2]}
  else
    echo "Error: Arguments must be of the form option=..." >&2
    exit 1
  fi
done
# "${opt["abc"]}" is the value of option abc=...
# "${opt[@]}" is an unordered (!) list of all values
# "${!opt[@]}" is an unordered (!) list of all options

使用例:

script.sh abc=... xyz=...

本当に位置パラメータに固執したい場合は、使用してください

#! /usr/bin/env bash
param=()
for arg; do
  if [[ "$arg" =~ ^\$([1-9][0-9]*)=(.*) ]]; then
    param[BASH_REMATCH[1]]=${BASH_REMATCH[2]}
  else
    echo "Error: Arguments must be of the form $N=... with N>=1" >&2
    exit 1
  fi
done
if ! [[ "${#param[@]}" = 0 || " ${!param[*]}" == *" ${#param[@]}" ]]; then
  echo "Error: To use $N+1 you have to set $N too" >&2
  exit 1
fi
set -- "${param[@]}"
# rest of the script
# "$@" / $1,$2,... are now set accordingly

使用例:

script.sh $1=... $3=... $2=...

上記のアプローチは、スクリプト/プログラムを変更できない場合のラッパーとしても使用できます。これを行うには、 に置き換えset -- "${param[@]}"exec program "${param[@]}"から使用しますwrapper.sh $1=... $3=... $2=...

于 2021-08-15T09:29:49.313 に答える