使用Section-A中的shell脚本,我得到输出,如Section-B所示。但是,预期/期望的输出如Section-C所示。需要帮助修改代码以获得所需的输出。
A部分:Shell脚本
#!/usr/local/bin/bash
i=0
a="1234-A1;1235-A2;2345-B1;5678-C2;2346-D5"
IFS="[;]" read -r -a arr <<< "1234-A1;1235-A2;2345-B1;5678-C2;2346-D5"
#printf '%s\n' "${arr[@]}"
for chip in "${arr[@]}"
do
echo " var $((i++)) is : $chip"
done
B部分:上述代码的输出
var 0 is : 1234-A1
var 1 is : 1235-A2
var 2 is : 2345-B1
var 3 is : 5678-C2
var 4 is : 2346-D5
C部分:期望的输出是:
var 0 is : 1234 and version is A1
var 1 is : 1235 and version is A2
var 2 is : 2345 and version is B1
var 3 is : 5678 and version is C2
var 4 is : 2346 and version is D5
答案 0 :(得分:0)
作为使用正则表达式分割值的一般方法,即使不是在这种情况下实现所需结果的唯一(或最佳)方法,您也可以这样:
#!/bin/bash
a="1234-A1;1235-A2;2345-B1;5678-C2;2346-D5"
declare -i i=0
IFS=";" read -a records <<<"$a"
for record in "${records[@]}"
do
[[ $record =~ (.*)-(.*) ]] || continue
echo "var $((i++)) is ${BASH_REMATCH[1]} and version is ${BASH_REMATCH[2]}"
done
答案 1 :(得分:0)
您是否有任何理由不直接从您拥有的值初始化关联数组?
#!/bin/bash
declare -rgA arr=([1234]=A1 [1235]=A2 [2345]=B1 [5678]=C2 [2346]=D5)
i=0
for chip in "${!arr[@]}"
do
echo "var $((i++)) is $chip and version is ${arr[$chip]}"
done
(关联数组的性质使得这些值通常不会按照您输入的顺序打印。如果这是一个主要问题,可以使用两个常规数组。)
答案 2 :(得分:0)
使用字段分隔符(IFS
)和read
的分隔符选项,只使用一个read
命令,即可获得所需的结果。
#!/bin/bash
a="1234-A1;1235-A2;2345-B1;5678-C2;2346-D5;"
declare -i i=0
while IFS="-" read -d ";" -r chip version
do
echo "var $((i++)) is $chip and version is $version"
done <<<"$a"
将分号视为记录分隔符,将IFS
视为如何分割记录中的字段。每个记录read
读取两个变量。
请注意,您需要在数据中添加尾部分号,否则最后一条记录将被丢弃。
答案 3 :(得分:0)
#!/usr/local/bin/bash
i=0
a="1234-A1;1235-A2;2345-B1;5678-C2;2346-D5"
IFS="[;]" read -r -a arr <<< "1234-A1;1235-A2;2345-B1;5678-C2;2346-D5"
#printf '%s\n' "${arr[@]}"
for chip in "${arr[@]}"
do
echo " var $((i++)) is : $chip"
echo "var $((i++)) is : ${chip%-*} and version is ${chip#*-}"
done
输出:
var 0 is : 1234 and version is A1
var 1 is : 1235 and version is A2
var 2 is : 2345 and version is B1
var 3 is : 5678 and version is C2
var 4 is : 2346 and version is D5
答案 4 :(得分:0)
我不确定使用数组是否是先决条件。如果不是,那么一线解决方案就是:
echo $a | tr ";" "\n" | awk -F\- '{ print "var "NR" is : "$1" and version is "$2 }'