3

これを実行したいbashスクリプトがあります

    (in pseudo)
    for each item in excludelist
        append to string: | grep -v $item

    for each file in directory 
    do
        stuff
    done

そしていま

   (in real code, the creation and concatenation of f works, the problem is not here I believe)
   for i in $EXCLUDE
   do
       echo $i
       f="$f | grep -v $i"
   done

   for d in `ls $AWSTATSCONF/awstats*conf $f`
   do
       echo $d
   done

出力

   ls: |: No such file or directory
   ls: grep: No such file or directory

これを機能させるために本当に感謝しています。

ご挨拶、

4

5 に答える 5

2

bash を使用しているため、パターン マッチングを使用して EXCLUDE リストを除外できます。

pattern=$(awk ' BEGIN {OFS="|"; printf("!(")} 
                {$1=$1; printf("%s",$0)} 
                END {print ")"}
              ' <<< $EXCLUDE)
shopt -s extglob
for d in $pattern; do
  echo $d
done    
于 2012-05-07T13:36:24.680 に答える
0

使用しないでくださいfor i in $(ls)。グロブを使用する必要があります。

の長い文字列を作成するために連結を使用しないでくださいgrep -v

どこ$EXCLUDEから来たの?文字列ではなく配列にする必要があります。

for d in "$AWSTATSCONF"/awstats*conf
do
    for e in "${exclude[@]}"
    do
        if [[ $d != $e ]]
        then
            echo "$d"
        fi
    done
done
于 2012-05-07T09:14:22.267 に答える
0

問題はfoo whatever whatever else、 ls コマンドへの単純なエスケープ引数として実行されることです (もちろん | と grep は現在のディレクトリにはありません)。eval文字列をbashコマンドとして実行するコマンドです

次のようなことをする必要があります

for d in `eval "ls $AWSTATSCONF/awstats*conf $f"`
do
   echo $d
done

これにより、セキュリティに関して大きなワームが発生することに注意してください。詳細を理解し、他の代替手段については、次のFAQを確認してください。

于 2012-05-07T08:45:05.457 に答える
-1

grepの *output をtoに追加する必要があります$f

$f = "$f $(grep -v $i)"
于 2012-05-07T08:22:49.340 に答える