2

ファイルの先頭または末尾に空白行があるすべてのファイルを一覧表示する bashスクリプトを見つけました。

for f in `find . -type f`; do 
  for t in head tail; do 
    $t -1 $f  |egrep '^[  ]*$' >/dev/null && echo "blank line at the $t of $f" ;
  done; 
done

出力をファイルに渡したいと思います。echo行を次のように変更しました。

$t -1 $f  |egrep '^[  ]*$' >/dev/null && echo "blank line at the $t of $f" > blank_lines.log

しかし、これはうまくいきませんでした。

&&シンボルの機能と、上記の行が出力をファイルに渡さない理由をお聞きしたいと思います。

4

4 に答える 4

5

これは出力をリダイレクトせず、最初のコマンドが成功した場合にのみ実行する別のコマンドを追加します。つまり、 executeをcommand1 && command2意味しcommand1、成功した場合は execute を意味しcommand2ます。また、このステートメントの実行結果は、両方のコマンドが成功した場合にのみ成功します。

于 2013-01-16T14:16:42.400 に答える
3

リダイレクトが機能しない理由は、>出力をリダイレクトしていたためです。これにより、コマンドの出力を書き込む前にファイルが消去されます。つまり、最後に書き込まれたものだけが表示されます。これを修正するには、>>append を使用するか (ただし、スクリプトの複数回の実行による出力が蓄積されないように、最初にファイルを切り詰める必要がある場合があります)、ループ全体の出力をリダイレクトします。

ところで、for ... findファイルを反復するために使用している構成は、ファイル名にスペースやその他の変な文字が含まれていると、ひどく失敗します。使用する方がはるかに優れていますfind ... -print0 | while IFS= read -d $'\0' ...(そして、を二重引用符で囲みます$f):

find . -type f -print0 | while IFS= read -d $'\0' f; do 
    for t in head tail; do 
        $t -1 "$f"  |egrep '^[  ]*$' >/dev/null && echo "blank line at the $t of $f"
    done
done > blank_lines.log
于 2013-01-16T15:37:28.337 に答える
3

これは短絡された「and」演算子です。出力リダイレクトには関与しません。

このコンテキストでは、左側が成功した場合にのみ右側を実行します。つまり、egrep によって報告された空白行が実際にあった場合にのみ、「... の空白行」が出力されます。

于 2013-01-16T14:16:59.640 に答える
2

他の人が述べたように、 && は短絡された and 演算子です。

command1 && command2

command1 を実行し、そのコマンドがエラーなしで実行された場合 (終了コード 0)、command2 を実行します。次に、command2 の終了コードを返します。

echo "foo" > /dev/null && echo "bar" > tmp.txt

動作するので、スクリプトが動作しない理由は別のものでなければなりません。おそらく実行してみてください

$t -1 $f  |egrep '^[  ]*$' >/dev/null && echo "blank line at the $t of $f" > blank_lines.log

変数と for ループのない行。

于 2013-01-16T15:12:20.433 に答える