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