将1:2:10字符串解析为3个变量

时间:2016-05-19 00:00:24

标签: bash shell sh

在bash shell中,解析输入字符串1:2:10以设置A = 1,B = 2,C = 10的最佳方法是什么?自动将A,B,C设置为由':'分隔的3个数字。

此外,如果输入仅为1:10,则设置A = 1,C = 10,然后B =某个默认值。

是的,我正在尝试模拟Matlab中使用的格式。 1:2:10扩展到1,3,5,7,9和1:10扩展为1,2,3,4,5,6,7,8,9,10。我在想我是否愿意可以将A,B和C设置为正确,这样做很容易。

谢谢!

2 个答案:

答案 0 :(得分:2)

$ IFS=: read a b c <<< '1:2:10'
$ echo $a
1
$ echo $b
2
$ echo $c
10
$ seq "$a" "$b" "$c"
1
3
5
7
9
$ IFS=: read a b c <<< '1:10'
$ echo $c

$ [ "$c" ] || seq "$a" "$b"
1
2
3
4
5
6
7
8
9
10

答案 1 :(得分:2)

你可以在一个简单的bash函数中完成所有这些:

s()( IFS=:; seq $1; )

这会创建一个本地环境(这就是定义有括号而不是大括号的原因),其中IFS被修改为在冒号上分割。由于本地IFS$1与冒号分开。由于seq正好按照您指定的顺序要求两个或三个参数,因此结果非常符合您的预期:

$ s 1:2:10
1
3
5
7
9
$ s 2:4
2
3
4

变量替换将起作用,因为它们是在调用s之前完成的:

$ from=1 to=6 by=2
$ s $from:$by:$to
1
3
5