다음 배열 루프를 설정했습니다. 문자열을 반복하면서 각 항목이 문자와 일치하는지 확인하고 이에 따라 일부 변수를 설정합니다.
#!/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