Bash:位置パラメータのスライス

最初にコピーせずに、Bashで$@のスライスを取得するにはどうすればよいですか。このような別の配列へのすべての位置パラメータ?

argv=( "$@" ) echo "${argv[@]:2}"; 

コメント

  • 常に"$@"argvの割り当ては、引数にスペースが含まれていると壊れます。

回答

他の配列と同じ形式を使用できます。 $@から2番目と3番目の要素を抽出するには、次のようにします。

echo "${@:1:2}" - - | |----> slice length |------> slice starting index 

コメント

  • しかし、これはv4.1.2では文字ごとに機能するようですが、単語ごとに実行する方法はありますか?
  • @AlexejMagura I '意味がわからない。それは配列の要素に作用します。 1文字の要素がある場合は、"文字"で機能します。各要素が単語の場合、単語に対して機能します。配列ではなく文字列でこれを試しているのでしょうか?
  • ' " $ @ "、その時点で文字列になる可能性があると思いますが、'わかりません。
  • bash 4.2.46では、"${@:1:2}"は実際に 1番目 2番目 コマンドライン引数。一方、"${@:1}"完全なコマンドライン引数を提供し、"${@:0}"スクリプト名を提供します完全なコマンドライン引数が続きます
  • @Rockalliteそうですね。 $@配列の2番目と3番目の要素は、1番目と2番目の引数です。 "${@:1}"は、2番目の要素(最初の引数)から始まる配列全体を出力し、${@:0}は、最初の要素から始まる配列全体を出力します。スクリプトの名前。何を期待していましたか?

回答

関数パラメーターの場合、はまったく機能しませんでした。また、最初の要素は別のパラメーターであるため、スライスオフが必要でした。機能したのは次のとおりです。

function foo(){ #takes single param + array of params local param1="$1". #first param local -a tmp=( "${@}" ) #copy all params local -a rem_params=( "${tmp[@]:1}") #slice off first:Works! # local -a rem_params=( "${@[@]:1}" ) #DID NOT WORK, ERROR # local -a rem_params=( "{@:1}" ) #DID NOT SLICE echo "${rem_params[@]}" } 

多分私はこれがスクリプトレベルでの位置引数でどのように機能するかをテストするために書きますが、今は時間がありません。

回答

私は通常これを行います:

somefunc() { local message="$1" shift echo "message = $message" echo "other = $@" } somefunc first second third goforth 

印刷されます:

message = first other = second third goforth 

2番目、3番目などの引数の後にshiftを追加することで、概念を拡張できます

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です