2011-07-17 12 views
0

私は〜/ .configを中に設定ファイルを編集するための基本的なスクリプトを持っている - それはcd線で動作しますが、それは冗長なようだ:バッシュ変数の代入

dir=$HOME/.config/$1 
if [ ! -d "$dir" ]; then : 
    else 
    cd "$dir" && 
    for file in * ; do 
     case "$file" in 
     conf | config | *.cfg | *rc) $EDITOR "$file" ;; 
     *) : ;; 
     esac 
    done 
    cd - 1>/dev/null; 
fi

はそれが"$dir"が失敗した変数を使用して変更します。私は間違って何をしていますか?

dir=$HOME/.config/$1 
if [ ! -d "$dir" ]; then : 
    else 
    for file in "$dir" ; do 
     case "$file" in 
     conf | config | *.cfg | *rc) $EDITOR "$file" ;; 
     *) : ;; 
     esac 
    done; 
fi
+1

なぜ[if [! -d "$ dir"];それから:; else if cd "$ dir" ...単に 'if [-d" $ dir "]の代わりに; cd "$ dir" ... '? –

+0

@glennありがとう:無知。純粋でシンプルな – Edouard

答えて

0

"$ dir"だけでは使用できません。これはディレクトリが1つだけであるためです。 $ dir/*が必要ですが、それにはパスも含まれていますので、ファイル名だけを比較するにはそれを削除する必要があります:

... 
for file in $dir/*; do 
    filename=`basename $file` 
    case $filename in 
    ... 
+0

ありがとうございます。これをより完全に理解するために私が読むことができるものはありますか? – Edouard

+0

@エドワード:私は本当にあなたを偉大な資源に導くことができないのではないかと心配しています。私がシェルスクリプティングについて知っていることのほとんどは、私はその場で取り上げました。私はそれを覚えていないので、私は "basename"コマンドを見つけるためにGoogleの検索を行う必要がありました:)基本的に、 "for"は "in"の後ろに来るすべてのファイルを反復処理します。 $ dir/*は、ディレクトリ "$ dir"にあるすべてのファイルのリストに展開されます。 $ dirが/ foo/barで、そのファイルに "baz"という名前のファイルがある場合、ループ内で$ fileの値は/ foo/bar/bazになります。 'basename'コマンドはパスを取り除き、あなたに" baz "を与えます。それはそれを説明しますか? –

+0

これは非常にいいです。ありがとうございました。 – Edouard

1

あなたは単に$dir自体をリストアップ、$dir内のファイルグロブていません。試してください$dir/*

+0

正確に!それに私を打つ。 :-) –

+0

ありがとう:しかし、 "$ dir"/*や$ dir/*は動作しません。 – Edouard

+0

@エドワード: '$ {dir}/*'を試しましたか? – Hello71

0

最初のバージョンではディレクトリに*があり、ディレクトリ内のすべてのファイルのリストが生成されます。あなたの2番目のバージョンはリストに1つのエントリしかありません---その内容ではなくディレクトリそのものです。