2017-07-05 15 views
2

削除するファイルとフォルダを含むブラックリストファイルから文字列を読みます。単純なファイル名では動作しますが、ワイルドカードでは動作しません。ワイルドカードを文字列変数に展開します

など。シェルにrm -rf !(abc|def)と入力すると、これら2つのファイル以外のすべてが削除されます。このストリング!(abc|def)をブラックリストに入れると、ストリングが評価されないため、機能しません。

私はevalを使用しようとしましたが、期待どおりに動作しません。

#!/bin/bash 
# test pattern (normally read from blacklist file) 
LINE="!(abc|def)" 

# output string 
echo "$LINE" 

# try to expand this wildcards 
eval "ls $LINE" 

# try with subshell 
(ls $LINE) 

これをどうすればいいですか?

+0

「ブラックリストファイルから文字列を読み込んでいます」:どうですか?あなたのコードはこの部分を表示しません。 – sjsam

+0

これには-regexと-deleteでfindを使うのが良いでしょう。 –

+0

sjsam、私はこの部分を私の問題とは関係がないので見せていませんでした。私は問題を再現しやすくするために、切り捨てられたスクリプトを用意しました。 – user3150128

答えて

4

ほとんどの場合、非対話シェル(スクリプトが実行されているようなシェルオプション)ではシェルオプションがオフになります。

あなたはいくつかのものに変更する必要があります。extglobシェルオプション

  • 使用に

    • ターンにあなたが持っている

      #!/bin/bash 
      
      # Turn on extglob shell option 
      shopt -s extglob 
      
      line='!(abc|def)' 
      
      echo "$line" 
      
      # Quoting suppresses glob expansion; this will not work 
      ls "$line" 
      
      # Unquoted: works! 
      ls $line 
      

      $line引用符で囲まれていない:引用はほとんどですグロブ拡大を抑制常にが必要ですが、ここにはありません

    小文字の変数名を使用しています。大文字はシェル変数と環境変数に予約されています。小文字を使用すると名前の衝突の可能性が低くなります(POSIX spec、第4段落参照)。

    また、ここではevalは必要ありません。

  • +0

    これで問題が解決する可能性があります。しかし、私は、オペレータがブラックリストファイルからこれらのファイル名をどのように読み込んでいるのか興味があります。 ) – sjsam

    +2

    @sjsamはい、おそらくX/Yの問題かもしれません;) –

    +0

    あなたはBash配列変数(例えば 'a =($ line)'や 'for 'のように見える名前の問題を避けるために' - 'を使うことについてのいくつかのガイダンスを書く価値があるかもしれませんオプションもあります。 –

    関連する問題