2011-07-19 2 views
2

を書いていて、私は私が何をしたいのか、文字列テイクトークン...「3を検討している、それはこんにちは、私はbashスクリプトを

foo=1.0.3

を持っていることを確認していません'私が最初にしたことは、これを行うことによって期間を取り除くことでした。 bar=echo $foo|tr '.' ' '最後の一重引用符までのエコーを含むバッククォート(書込みを達成する方法がわかりません)

echo $barを実行すると、1が出力されます3 3.ここで3を保持する変数を作成するにはどうすればよいですか?ずっと

答えて

3

あなたは間違いなくbashのについての学習をされていないとして、あなたの目標を達成するための多くの多くの方法があります。私は@ Matの答えはbar=${foo##*.}を使っていると思っていますが、彼はそれがどのように、なぜそれがうまくいくのか説明していません。 bash tutorial on tldpをチェックアウトすることを強くお勧めします。このような質問がある場合は、私のGotoソースです。文字列の操作には、その部分にdiscusses many of the different ways to go about this sort of thingというセクションがあります。

あなたはfooは常に長い5つの文字になるだろうことを知っている場合たとえば、あなたは、単にそれから5番目の文字を取ることができますが:

bar=${foo:4} 

、FOOの第五の位置をバー作るている(覚えています、私たちはゼロから数え始めます。

あなたは常にFOOの最後の位置になるだろう知っている場合は、あなただけ後方に数えることができます。-1とコロンの間にスペースがある

bar=${foo: -1} 

お知らせを、あなたがそれを必要とする(またはかっこ)を使用して、負の符号をエスケープします。

@Matの答えを説明するために、私は上記のリンクを見なければなりませんでした。どうやら式で(あなたがそれらを呼び出すために好きなハッシュマーク、octothorpe、)二重のシャープ記号は:

${string##substring} 

$stringの正面から$substringの最長一致を削除することを意味します。だから、*.の最長一致を探しています。これは、ドットの前にのすべてと等しいです。かなりクールですね?

+0

ありがとうございました。とてもかっこいい。私が読むことができる余分なドキュメントに特別なおかげです。 – Rell3oT

0

一つの方法:配列を構築し、位置2取る:

array=(`echo $foo | tr . ' '`) 
echo ${array[2]} 
+0

スクリプトで 'echo $ {array [2]}'という行を使用するにはどうすればいいですか?私はスクリプトでそれを使用しようとしていましたが、 ''(予期せぬことです。余分なバッククォートや引用符や二重引用符や括弧が必要ですか(bashは私を殺しています)。どうもありがとうございます – Rell3oT

+0

@ Rell3ot:括弧と括弧についての質問には、http://tldp.org/LDP/abs/html/testconstructs.htmlをご覧ください。あなたの質問に答えるために、$ {array [2]}を代入するだけではエコーは必要ありません。単にbar = $ {array [2]}を実行するだけです。しかし、他の(おそらくより良い)方法があります。他の答えをチェックしてください。 –

2

これは動作するはずですが:

bar=$(echo $foo|cut -d. -f3) 

あなたが唯一の希望を知っている場合

bar=${foo##*.} 

利点::一部あなたもこれを行うことができ、最後のドット(.で区切らリストにない3番目の項目)の後に余分なプロセスやサブシェルが起動しません。

0

これは、あまりにも動作するはずです:

echo $foo | awk -F. '{print $3}' 
関連する問題