最初にコピーせずに、Bashで$@
のスライスを取得するにはどうすればよいですか。このような別の配列へのすべての位置パラメータ?
argv=( "$@" ) echo "${argv[@]:2}";
コメント
回答
他の配列と同じ形式を使用できます。 $@
から2番目と3番目の要素を抽出するには、次のようにします。
echo "${@:1:2}" - - | |----> slice length |------> slice starting index
コメント
- しかし、これはv4.1.2では文字ごとに機能するようですが、単語ごとに実行する方法はありますか?
- @AlexejMagura I '意味がわからない。それは配列の要素に作用します。 1文字の要素がある場合は、"文字"で機能します。各要素が単語の場合、単語に対して機能します。配列ではなく文字列でこれを試しているのでしょうか?
- ' " $ @ "、その時点で文字列になる可能性があると思いますが、'わかりません。
- bash 4.2.46では、
"${@:1:2}"
は実際に 1番目と 2番目 コマンドライン引数 bを提供します>。一方、"${@: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
を追加することで、概念を拡張できます
"$@"
。argv
の割り当ては、引数にスペースが含まれていると壊れます。