配列の最初の要素を確認する方法

配列の最初の要素を確認する方法

次の配列ループを設定しました。文字列を繰り返しながら、各項目が文字と一致することを確認し、それに応じていくつかの変数を設定します。

#!/usr/bin/env bash
IN="ItemName -a -b"

itemA=0
itemB=0
itemI=0

while IFS=' -' read -ra ARR; do
    for x in "${ARR[@]}"; do
        echo "x = $x"
        y=${x:0:1}
        echo "y = $y"
        case $y in
            "a") itemA=1 ;;
            "b") itemB=1 ;;
            "I") itemI=1 ;;
        esac
    done
done <<< "$IN"

echo "itemA is $itemA
echo "itemB is $itemB"
echo "itemI is $itemI" 

ただし、最初の要素( "itemName")については、ケースステムの一部として識別されないように別々に設定する必要があります。理想的には、次のように仕上げたいです。

itemName is ItemName
itemA is 1
itemB is 1
itemI is 0

最初の要素を確認する方法は?頑張った

if [ ${ARR[0]} ] ; then
    itemName=$x
else
 . . . 
fi  

しかし、最終的に変数は設定されません。

答え1

whileなぜループを使用したいのかわかりません。それを放すとwhile問題がなくなります。

#!/usr/bin/env bash
IN="ItemName -a -b"
itemA=0
itemB=0
itemI=0

## Read the array, no loop required
IFS=' -' read -ra ARR <<<"$IN"
## Save the 1st element as itemN
itemN=${ARR[0]}
## Remove itemN from the array
unset ARR[0]
## Now loop over the rest
for x in "${ARR[@]}"; do
    y=${x:0:1}
    case $y in
        "a") itemA=1 ;;
        "b") itemB=1 ;;
        "I") itemI=1 ;;
        esac
done

echo "itemN is $itemN"
echo "itemA is $itemA"
echo "itemB is $itemB"
echo "itemI is $itemI" 

上記のスクリプトを実行すると、次のものが印刷されます。

itemN is ItemName
itemA is 1
itemB is 1
itemI is 0

答え2

これが必ずしも最善のアプローチであるかどうかはわかりませんが、うまくいきます。

#!/usr/bin/env bash
IN="ItemName -a -b"

itemName=0
itemA=0
itemB=0
itemI=0

while IFS=' -' read -ra ARR; do
    for x in "${ARR[@]:1:0}"; do
        itemName=$x
    done

    for x in "${ARR[@]:1}"; do
        y=${x:0:1}
        case $y in
            "a") itemA=1 ;;
            "b") itemB=1 ;;
            "I") itemI=1 ;;
        esac
    done
done <<< "$IN"

echo "itemName is $itemName"
echo "itemA is $itemA
echo "itemB is $itemB"
echo "itemI is $itemI" 

基本的に配列を2回処理しています。一度に最初の項目のみをインポートし、最初の項目を除くすべての項目を再インポートします。

答え3

もっと配列を使いましょう。この答えは、bashバージョン4の連想配列に依存します。

IFS=' -' read -ra words <<<"$IN"
declare -A items

for i in "${words[@]}"; do
    [[ $i == "ItemName" ]] && continue
    items["${i:0:1}"]=1
done

for key in "${!items[@]}"; do
    echo "item $key is ${items[$key]}"
done
item a is 1
item b is 1

アイテム配列のいくつかのデフォルト値を設定する必要がある場合:

declare -A items=([a]=0 [b]=0 [c]=0)

それからあなたは見るでしょう

item a is 1
item b is 1
item c is 0

関連情報