2010-12-08 11 views
2

argを与えることで要素配列の位置を返すbashスクリプトを作成します。Bash argsで配列要素の存在を選択

$script.sh DD 
4 

任意のアイデアを: コード怒鳴るを参照してください、私は

#!/bin/bash 
args=("[email protected]") 
echo ${args[0]} 
test_array=('AA' 'BB' 'CC' 'DD' 'EE') 
echo $test_array 
elem_array=${#test_array[@]} 
for args in $test_array 
do 
     echo 
done 

を使用Finnally私のような出力を持っている必要がありますか? ありがとうございます。

答えて

1

複雑なツールを避けるためにしよう:

test_array=('AA' 'BB' 'CC' 'D D' 'EE') 
OLD_IFS="$IFS" 
IFS=" 
" 
element=$(grep -n '^D D$' <<< "${test_array[*]}" | cut -d ":" -f 1) 
IFS="$OLD_IFS" 
echo $element 

しかし、それは2つのプロセスを消費します。我々は自分自身sed許可する場合、我々は、単一のプロセスでそれを行うことができます:

test_array=('AA' 'BB' 'CC' 'D D' 'EE') 
OLD_IFS="$IFS" 
IFS=" 
" 
element=$(sed -n -e '/^D D$/=' <<< "${test_array[*]}") 
IFS="$OLD_IFS" 
echo $element 

更新:

コメントでthkalaで指摘したように、この溶液は3例で壊れています。次の場合は使用しないでください。

  1. ゼロインデックス付きオフセットが必要です。
  2. 配列要素に改行があります。
  3. あなたはスパース配列を持っているか、整数以外のキーを持っています。
+0

これは2つの点で壊れています。1. bash配列が0ベースなので、off-by-oneエラーが発生します.OPにも1ベースのインデックスが必要です。 2.配列インデックスが連続しているとみなしますが、配列インデックスの割り当てにギャップがある場合、またはいくつかの要素が設定されていない場合は完全に中断します... – thkala

+0

ああ、配列のいずれか要素に改行が含まれています... – thkala

+0

真実、真実、真:Aoutch!私は、bashの配列は本当にマップであることを覚えようとします。しかし、ポスターの縫い目が答えを好むように、私はそれを削除しませんが、あなたが見つけた限界を指摘するためにそれを更新します。 – jfg956

6
#!/bin/bash 

A=(AA BB CC DD EE) 

for i in "${!A[@]}"; do 
     if [[ "${A[i]}" = "$1" ]]; then 
       echo "$i" 
     fi 
done 

は、アレイ内の有効なインデックスのリストを与える"${!A[@]}"表記に注意してください。通常、索引は必ずしも連続しているわけではないので、0から"${#A[@]}" - 1までは移動できません。配列要素の割り当てにギャップがある場合、またはいくつかの要素が設定解除されている場合は、インデックス範囲にギャップが存在する可能性があります。

上記のスクリプトは、内容がスクリプトの最初のコマンドライン引数と等しい配列のすべてのインデックスを出力します。

EDIT:あなたの質問に

、あなたは1ベースの配列のインデックスとして結果を望んでいるように見えます。その場合、あなただけの1で結果をインクリメントすることができます

#!/bin/bash 

A=(AA BB CC DD EE) 

for i in "${!A[@]}"; do 
     if [[ "${A[i]}" = "$1" ]]; then 
       let i++; 

       echo "$i" 
     fi 
done 

は、このインデックスはは、ゼロベースのアレイで使用される前にを減らさなければならないであろうということ、しかし、覚えておいてください。

1

配列をループし、位置を追跡します。 入力引数に一致する要素が見つかったら、要素の位置を出力します。配列には0から始まるインデックスが付いているため、位置に1を追加する必要があります。ループなし

#! /bin/sh 
arg=$1 
echo $arg 
test_array=('AA' 'BB' 'CC' 'DD' 'EE') 
element_count=${#test_array[@]} 
index=0 

while [ $index -lt $element_count ] 
do  
    if [ "${test_array[index]}" = "$arg" ] 
    then 
    echo $((index+1)) 
    break 
    fi 
    ((index++)) 
done 
1

#!/bin/bash 

index() { 
    local IFS=$'\n'; 
    echo "${*:2}" | awk '$0 == "'"${1//\"/\\\"}"'" { print NR-1; exit; }' 
} 

array=("D A D" "A D" bBb "D WW" D "\" D \"" e1e " D " E1E D AA "" BB) 
element=${array[5]} 
index "$element" "${array[@]}" 

出力:

5 
関連する問題