2016-05-17 5 views
2

は、次のスクリプトを考えてみましょう:変数のブレース拡張を行うにはどうすればよいですか?

#! /bin/bash -e 

echo {foo,bar} 
EX={foo,bar} 
echo ${EX} 

このスクリプトの出力は次のとおりです。

foo bar 
{foo,bar} 

私は${EX}上のブレース展開を実行するためのechoコマンドをしたいと思います。したがって、私は、ユーザーがそれのすべての拡張バージョンがコピーされる中括弧でパスを指定することができますスクリプトを作成したい

foo bar 
foo bar 

の出力を確認したいと思います。このような

何か:

#! /bin/bash -e 

$SOURCES=$1 
$TARGET=$2 

cp -r ${SOURCES} ${TARGET} 

どのように私はこれを達成することができますか?

+1

「cp -r foo bar foo bar」とは何ですか? – anubhava

+2

変数の前に評価されるため、変数をブレース拡張することもできません。 – 123

+0

は事を過度に複雑にしません。あなたはあなたのスクリプトを一度書き、それを何度も(おそらく)使用します。ですから、それを保存しようとする理由はありません。 – Serge

答えて

1

man bash参照:

展開の順序である:ブレース展開、チルダ展開、パラメータ、変数および(左から右への方法で行わ)算術膨張およびコマンド置換、単語分割、およびパス名展開。

ご覧のとおり、変数展開は中括弧拡張より後で行われます。

幸いにも、あなたはそれをまったく必要としません。ユーザがブレースされたパスを指定し、シェルがそれらを展開できるようにします。

sources=("${@:1:$#-1}") 
target=${@: -1} 
mv "${sources[@]}" "$target" 
+0

良いアドバイス - 既に展開されている引数を受け入れると、シェルスクリプトは他のアプリケーションのように動作し、ユーザーは通常の方法でシェルを使用します。スクリプトによってグロブグされる)。 –

4

これが道である:

ex=({foo,bar,baz}) 
echo ${ex[@]} 
foo bar baz 
+0

値を配列に入れることは、* brace-expansion *を使用したscoucheと異なります。 –

+0

@ DavidC.Rankinこれは実際には驚くほど機能し、複数のブレースを内部に配置することができます。 – 123

+0

中括弧のネスト機能はbash以外にも使用されます。 *部分文字列を削除したパターン展開*が良い例です。 –

1

ブレース展開は動作しません。それから、ちょうど

mv "[email protected]" 

あなたは、引数を区切るアレイとパラメータの拡張を使用する必要がある場合することができますあなたがそれを使用しようとしている方法。ブレース拡張は、基本的に、現在のコマンドのコンテキスト内で適用されるリストを生成するために使用されます。中括弧拡張が直接使用される2つの主なモードがあります(中括弧拡張が別の演算子の一部として使用される場合はさらに多くがあります)。直接使用する2つの方法は、の中の項目のリストを広げます。例えばあなたはまた、同様の方法でブレース拡張を使用することができ

$ ls -1 file*.txt 
file_a.txt 
file_b.txt 
file_c.txt 
file_d.txt 

$ touch file_{a,b,c,d}.txt 

コマンドを実行した後、ブレース展開は、現在のディレクトリに適切な形式のファイル名を持つすべての4つのファイルを作成しますループ反復のためのリストを生成する(または、生成されたシステム/必要な数の範囲)。 の中括弧の展開の構文は似ていますが、中括弧内の..区切り文字(','の区切りではなく)で区切っています。構文は{begin..end..increment}です(増分は正と負の両方になります)。

$ for i in {20..-20..-4}; do echo $i; done) 
20 
16 
12 
8 
4 
0 
-4 
-8 
-12 
-16 
-20 

注:beginendまたはincrementの変数を使用してはevalいくつか恐ろしい策略なしに許可されていない - それを避けます。)。

関連する問題