배열의 첫 번째 요소를 확인하는 방법

배열의 첫 번째 요소를 확인하는 방법

다음 배열 루프를 설정했습니다. 문자열을 반복하면서 각 항목이 문자와 일치하는지 확인하고 이에 따라 일부 변수를 설정합니다.

#!/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" 

기본적으로 배열을 두 번 처리하고 있습니다. 한 번에 첫 번째 항목만 가져온 다음 첫 번째 항목을 제외한 모든 항목을 다시 가져옵니다.

답변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

관련 정보