Bash 使用 ISF 输入的数组
Bash array from input using ISF
我有一个以 1,3, 5, 7-10,... 的方式给出的字符串,...这需要放在 1 3 5 7 8 9 10 的数组中,所以任何地方都有一个减号然后我需要添加缺失的数字。我可以使用 IFS 将其拆分为一个数组,在任何有逗号的地方挑出。问题是当我再次使用 IFS 拆分两个数字(例如 7-10)时,它不会拆分它们。这是我的代码:
IFS=', ' read -r -a array <<< "$string"
for index in "${!array[@]}"
do
if [[ ${array[index]} == *[-]* ]]; then
IFS='- ' read -r array2 <<< "${array[index]}"
#for Counter in $(eval echo "{${array2[0]}...${array2[1]}}")
#do
#echo "$Counter ${array2[Counter]}"
echo "0 ${array2[0]}"
echo "Yes"
#done
fi
done
for index in "${!array[@]}"
do
echo "$index ${array[index]}"
done
第二个 IFS 的输出给我 7-10,这意味着它没有拆分它(你可以从代码中看到我在解决问题时遇到了一些问题。我的想法是拆分它并在 for 循环中使用它将所需的数字附加到我现有的数组。)
如果你能给我指出正确的方向,请告诉我为什么这不起作用,或者提出一个更好的想法。
这里是对您的代码的轻微更新,可以满足您的需求:
str="1, 2, 3, 5, 7-10, 11, 12, 15-20, 24"
IFS=', ' read -r -a arr <<< "$str"
# Empty array, populated in the for-loops below
array=()
for elem in ${arr[@]}; do
if [[ $elem == *[-]* ]]; then
IFS='-' read -r -a minMax <<< $elem
for (( j = ${minMax[0]}; j <= ${minMax[1]}; j++ )); do
array+=($j)
done
else
array+=($elem)
fi
done
echo ${array[@]}
这将输出:
1 2 3 5 7 8 9 10 11 12 15 16 17 18 19 20 24
不使用循环,
string="1,3, 5, 7-10"
string=$(echo "$string" | sed -e 's/\(\([0-9]\+\)-\([0-9]\+\)\)/{..}/g' | sed -e 's/,/ /g')
eval declare -a array=("$string")
echo ${array[*]}
产生
1 3 5 7 8 9 10
我有一个以 1,3, 5, 7-10,... 的方式给出的字符串,...这需要放在 1 3 5 7 8 9 10 的数组中,所以任何地方都有一个减号然后我需要添加缺失的数字。我可以使用 IFS 将其拆分为一个数组,在任何有逗号的地方挑出。问题是当我再次使用 IFS 拆分两个数字(例如 7-10)时,它不会拆分它们。这是我的代码:
IFS=', ' read -r -a array <<< "$string"
for index in "${!array[@]}"
do
if [[ ${array[index]} == *[-]* ]]; then
IFS='- ' read -r array2 <<< "${array[index]}"
#for Counter in $(eval echo "{${array2[0]}...${array2[1]}}")
#do
#echo "$Counter ${array2[Counter]}"
echo "0 ${array2[0]}"
echo "Yes"
#done
fi
done
for index in "${!array[@]}"
do
echo "$index ${array[index]}"
done
第二个 IFS 的输出给我 7-10,这意味着它没有拆分它(你可以从代码中看到我在解决问题时遇到了一些问题。我的想法是拆分它并在 for 循环中使用它将所需的数字附加到我现有的数组。)
如果你能给我指出正确的方向,请告诉我为什么这不起作用,或者提出一个更好的想法。
这里是对您的代码的轻微更新,可以满足您的需求:
str="1, 2, 3, 5, 7-10, 11, 12, 15-20, 24"
IFS=', ' read -r -a arr <<< "$str"
# Empty array, populated in the for-loops below
array=()
for elem in ${arr[@]}; do
if [[ $elem == *[-]* ]]; then
IFS='-' read -r -a minMax <<< $elem
for (( j = ${minMax[0]}; j <= ${minMax[1]}; j++ )); do
array+=($j)
done
else
array+=($elem)
fi
done
echo ${array[@]}
这将输出:
1 2 3 5 7 8 9 10 11 12 15 16 17 18 19 20 24
不使用循环,
string="1,3, 5, 7-10"
string=$(echo "$string" | sed -e 's/\(\([0-9]\+\)-\([0-9]\+\)\)/{..}/g' | sed -e 's/,/ /g')
eval declare -a array=("$string")
echo ${array[*]}
产生
1 3 5 7 8 9 10