2017-01-26 2 views
1

bashの3.xの中で値によって配列インデックスを見上げる:./script_name 604が、私はこのスクリプトで呼び出す

#!/bin/bash 

switchedChannel=($1) 
channelArray=('108' '162' '163' '604' '141' '113') 

for array_item in "${channelArray[@]}"; do 
    if [[ $array_item == ${switchedChannel[0]} ]] then 
     "$array_item MATCHES" 
    fi 
done 

一致するarray_itemのインデックスを取得する方法はあります(またはそれ以外の位置を取得します単純にvarをカウンタとして使用し、これを繰り返し実行するのではなく、配列内の一致したアイテム)

常に一致しますが、配列の値は一意であるため、一致するのは1つだけです。

(私はマッチングされていない配列項目で何かをする必要があるので、私は尋ねていますので、配列からマッチした項目を削除することを考えています。短いリストの場合は、一致するとすぐにループを終了することをお勧めします)。

+0

'switchedChannel'は配列ではありません。 – chepner

+1

あなたの値がすべて正の数である場合は、連想配列は必要ありません。まばらなインデックス配列が必要です。 –

+0

BTW - 'switchedChannel =($ 1)'はかなりバグがあります。あなたのプログラムが './yourProg '*''で始まっていれば、配列のローカルディレクトリにあるファイルのリストを取得できます。 'IFS = 0'とユーザーが' 109'を渡すと、最初のエントリが '1'で2番目のエントリが' 9'である配列が得られます。あなたの実際の目標は何ですか?文字列を配列に読み込みたいのであれば、一般的な正しい方法は 'read -r -a switchedChannels'のようなものです。なぜこのことが意図であるのかは分かりませんが。 –

答えて

4

"${!array[@]}"は値ではなくインデックスを反復処理します。ご利用の場合のために、言った

#!/bin/bash 

switchedChannel=$1 
channelArray=('108' '162' '163' '604' '141' '113') 

for array_idx in "${!channelArray[@]}}"; do 
    array_item=${channelArray[$array_idx]} 
    if [[ $array_item = "$switchedChannel" ]] then 
     "$array_item MATCHES at index $array_idx" 
    fi 
done 

- あなたがで検索をやっている何かが非負整数である - あなたがよりよく行うことができます。

declare -a channelArray=([108]=1 [162]=2 [163]=3 [604]=4 [141]=5 [113]=6) 
echo "${channelArray[$switchedChannel]}" 

これが作成されますスパース配列ここで、キーは数字108,162などです。値は1,2,3などです。

+0

ありがとうございます。私は第二のアプローチが一番好きです。私は最初の1つは、反復のためのvarとしてarray_idxを使用していると思いますか? – Lorccan

+0

正しいですが、 'array_idx'は各インデックスを繰り返し処理するときのものです。 –

+0

あなたは私にもう1つ好意を持ち、ちょうど第2のルックアップで起こっていることを説明してください。 (それは望ましい結果を得ていますが、もっと学びたいと思います) – Lorccan

関連する問題