对于给定的脚本,我可以提供一个具有以下形式的参数:-u[number][letter][...]
示例:-u2T34T120F -u1T2T10F
字母为 T 或 F,数字为整数,最大可达 999。
我想要一个写循环,在每次迭代中,数字都存储在变量“a”中,对应的字母存储在变量“b”中。循环遍历参数中的所有数字-字母对。
对于第一个示例,参数是-u2T34T120F迭代将是:
- 第一:a=2 b=T
- 第二:a=34 b=T
- 第三:a=120 b=F
循环结束
任何建议都是最受欢迎的。
这是使用 GNU awk 的一种方法:
<<<"2T34T120F" \
awk -v RS='[TF]' 'NF { printf "a: %3d b: %s\n", $0, RT }'
输出:
a: 2 b: T
a: 34 b: T
a: 120 b: F
要在 bash while-loop 中使用它,请执行以下操作:
<<<"2T34T120F" \
awk 'NF { print $0, RT }' RS='[TF]' |
while read a b; do
echo Do something with $a and $b
done
输出:
Do something with 2 and T
Do something with 34 and T
Do something with 120 and F
$ var='-u2T34T120F'
$ a=($(grep -o '[0-9]*' <<< "$var"))
$ b=($(grep -o '[TF]' <<< "$var"))
$ echo ${a[0]} ${a[1]} ${a[2]}
2 34 120
$ echo ${b[0]} ${b[1]} ${b[2]}
T T F
这个怎么样:
kent$ while IFS=' ' read a b; do echo "we have a:$a,b:$b\n---"; done<<< $(echo '-u2T34T120F'|sed 's/^-u//;s/[TF]/ &\n/g')
we have a:2,b:T
---
we have a:34,b:T
---
we have a:120,b:F
---
清晰版:
while IFS=' ' read a b
do
echo "we have a:$a,b:$b\n---";
done<<< $(echo '-u2T34T120F'|sed 's/^-u//;s/[TF]/ &\n/g')
您可以在 bash 中使用参数扩展:
#! /bin/bash
set -- -u2T34T120F # Set the $1.
string=${1#-u} # Remove "-u".
while [[ $string ]] ; do
a=${string%%[FT]*} # Everything before the first F or T.
string=${string#$a} # Remove the $a from the beginning of the string.
b=${string%%[0-9]*} # Everything before the first number.
string=${string#$b} # Remove the $b from the beginning of the string.
echo $a $b
done
或者,使用相同的技术,但使用数组:
a=(${string//[TF]/ }) # Remove letters.
b=(${string//[0-9]/ }) # Remove numbers.
for (( i=0; i<${#a[@]}; i++ )) ; do
echo ${a[i]} ${b[i]}
done