我设置了以下数组循环。它只是循环遍历一个字符串并检查每个项目是否与字母匹配并相应地设置一些变量。
#!/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
如果您需要为 items 数组设置一些默认值:
declare -A items=([a]=0 [b]=0 [c]=0)
然后你会看到
item a is 1
item b is 1
item c is 0