1

对于给定的脚本,我可以提供一个具有以下形式的参数:-u[number][letter][...]

示例:-u2T34T120F -u1T2T10F

字母为 T 或 F,数字为整数,最大可达 999。

我想要一个写循环,在每次迭代中,数字都存储在变量“a”中,对应的字母存储在变量“b”中。循环遍历参数中的所有数字-字母对。

对于第一个示例,参数是-u2T34T120F迭代将是:

  • 第一:a=2 b=T
  • 第二:a=34 b=T
  • 第三:a=120 b=F

循环结束

任何建议都是最受欢迎的。

4

4 回答 4

4

这是使用 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
于 2013-05-16T11:51:15.003 回答
3
$ 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
于 2013-05-16T11:44:30.550 回答
2

这个怎么样:

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')
于 2013-05-16T11:46:02.983 回答
2

您可以在 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
于 2013-05-16T11:42:20.637 回答