2016-05-19 3 views
0

bashシェルでは、入力文字列1:2:10を解析してA = 1、B = 2、C = 10に設定する最良の方法は何ですか?自動的にA、B、Cを ':'で区切られた3つの数字に設定します。1:2:10の文字列を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を正しく設定できます。この動作は簡単です。

ありがとうございます!

+0

数字を解析すると、 'seq 1 2 10'と' seq 1 10'はあなたの望む拡張動作をします。 – leekaiinthesky

+0

Bashには、拡張子 'echo {1..10..2}'、 'echo {1..10}' - [manual](https://www.gnu.org/software/bash/manual)があります。 /bashref.html#Brace-Expansion)。 –

答えて

2

あなたはすべての1つの単純なbashの機能でこれを行うことができます。

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

IFSが上分割するように変更された内側(定義ではなく、中括弧の括弧を持っている理由です)ローカル環境を作成します結腸。ローカルIFSのため、$1はコロンで単語分割されます。 seqは、あなたが指定した順序で正確に2つのまたは3つの引数を期待しているので、あなたが期待するように、結果はかなりよくある:彼らはs前に行われているので

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

変数置換は、動作しますが呼び出されます。

$ from=1 to=6 by=2 
$ s $from:$by:$to 
1 
3 
5 
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 
+0

おかげさまでIgnacio !!このIFSはシステム変数ですか?私は自分の.shの後でそれを復元する必要がありますか? – Solti

+2

上記のコマンドの前に配置すると、その単一のコマンドを呼び出すためだけに設定されます。 –

関連する問題