我有以下 grep 命令
echo v1.33.4 | egrep -o '[0-9]{1,3}'
返回:
1
33
4
在 Bash 脚本中,我想将这些行分隔成一个数组。
我尝试将它直接分配给一个变量并对其运行 for 循环。但循环内的回声仅产生第一个数字1
回答问题
如何将行存储到数组中?
当 Bash≥4 时,使用mapfile
像这样:
mapfile -t array < <(echo "v1.33.4" | egrep -o '[0-9]{1,3}')
当 Bash
array=()
while read; do
array+=( "$REPLY" )
done < <(echo "v1.33.4" | egrep -o '[0-9]{1,3}')
或者,使用单个read
陈述:
IFS=$'\n' read -r -d '' -a array < <(echo "v1.33.4" | egrep -o '[0-9]{1,3}')
(但请注意,返回码是1
).
回答解决(我认为是)您的实际问题:
您有一个存储字符串的变量v1.33.4
你想要一个包含数字的数组1
, 33
and 4
:使用以下内容:
string=v1.33.4
IFS=. read -ra array <<< "${string#v}"
为此,您根本不需要外部实用程序。
另一种可能性(这也将验证字符串的格式,所以我认为这是最适合您的选择)是使用正则表达式:
string=v1.33.4
if [[ "$string" =~ ^v([[:digit:]]+)\.([[:digit:]]+)\.([[:digit:]]+)$ ]]; then
array=( "${BASH_REMATCH[@]:1}" )
else
echo >&2 "Error, bad string format"
exit 1
fi
然后,循环数组的字段:
for field in "${array[@]}"; do
echo "$array"
done
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)