Bash:位置パラメータスライシング

Bash:位置パラメータスライシング

$@すべての位置引数を別の配列に最初にコピーせずにBashからセクションを取得するにはどうすればよいですか?

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

答え1

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

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

答え2

Bashのより多くの配列スライシングの例

some_array_variableコードで使用するのではなく(argvあなたの場合)、その@変数名の代わりに使用してください。記号は@以下を示します。入力パラメータ配列、他の配列のように扱うことができます。混乱しても、私たちはこの文字がほとんど常に次の文字とペアになっている$のを見るのに慣れているので、これは配列自体であり、それ自体が配列変数として使用される可能性があることを$@認識していません。@

以下はいくつかの例です。

入力パラメータ配列からスライスすると、通常は配列を@簡単に表示してアクセスできます$@

# array slicing basic format 1: grab a certain length starting at a certain
# index
echo "${@:2:5}"
#         │ │
#         │ └────> slice length
#         └──────> slice starting index 

# array slicing basic format 2: grab all remaining array elements starting at a
# certain index through to the end
echo "${@:2}"
#         │
#         │
#         └──────> slice starting index 

覚えておくべきより多くの配列:

これは私自身の一般的な通知であり、このページを訪問している他の人に役立ちます。

# store a slice from an array into a new array
new_array=("${@:4}")

# print the entire array
echo "new_array = ${new_array[@]}"

以下は、bashの通常の配列スライスと配列要素へのアクセスの実行可能な例です。からインスピレーションを受けるこのソース:

(ユースケースに応じて、必要に応じて以下の代わりに@入力パラメータ配列として使用できます)a

a=(one two three four five six)   # define a new array, `a`, with 6 elements
echo "$a"           # print first element of array a
echo "${a}"         # print first element of array a
echo "${a[0]}"      # print first element of array a
echo "${a[1]}"      # print *second* element of array a
echo "${#a[@]}"     # print number of elements in array a
echo "${a[@]:1:3}"  # print 2nd through 4th elements; ie: the 3 elements
                    # starting at index 1, inclusive, so: indices 1, 2, and 3
                    # (output: `two three four`)
echo "${a[@]:1}"    # print 2nd element onward

すべて実行

上記のすべてのコードブロックを、実行可能ファイルと呼ばれるファイルにコピーして貼り付けて実行できるように、実行可能array_slicing_demo.shファイルとしてマークします。chmod +x array_slicing_demo.shまたは私のデモをダウンロードしてください。array_slicing_demo.sh私のファイルeRCAGuy_hello_world倉庫はこちらです。

次に、次のように実行します。

./array_slicing_demo.sh a b c d e f g h i j k

...次のような出力が表示されます。

b c d e f
b c d e f g h i j k
new_array = d e f g h i j k
one
one
one
two
6
two three four
two three four five six

引用する

  1. Bash:位置パラメータスライシング
  2. Bash変数の割り当ての単一の括弧

キーワード:bash配列インデックス。 bash配列スライシングの配列要素へのアクセス。

答え3

私は通常そうします:

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

これにより、次のものが印刷されます。

message = first
other   = second third goforth

shift2番目、3番目などのパラメータの後にingを使用してこの概念を拡張できます。

答え4

関数パラメータの場合、答えはecho "${@:1:2}"まったく機能しません。また、最初の要素は他のパラメータなので切り取りたいです。うまくいくのは次のとおりです。

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[@]}"
}

おそらくスクリプトレベルで位置パラメータがどのように機能するかを書いてテストしますが、今は時間がありません。

関連情報