ディレクトリにBashスクリプトを作成しました。私がそれを実行して "ls"すると、ディレクトリレベルに数字が表示され、 "rm"を使用して削除する必要があります。
このBashスクリプトの目的は、現在のファイルをディレクトリに保存し、保存された古い行数を取得し、ファイルlogstore.txt
にnumlines.txt
割り当てられた新しい行数を見つけ、numlines.txt
最後に古い行と比較する新しい行数を取得することです。番号(サーバーは時間の経過とともに変わります)新しいファイルが継続し(予想できない場合)、古い行の長さと新しい行の長さを比較します。
これは .sh ファイルのコードです。
ls /home/vcm > /home/vcm/logstore.txt
oldnumlines=$(cat /home/vcm/numlines.txt)
#log store takes the new ls of items and stores it as num lines after the old v$
cat logstore.txt | wc -l > /home/vcm/numlines.txt
newnumlines=$(cat /home/vcm/numlines.txt)
if [ ! "$newnumlines" > "$oldnumlines" ]
#[ "$a" -eq "$b" ]
#(( "$newnumlines" -le "$oldnumlines" ))
then
*do something*
fi
このスクリプトがディレクトリに新しい変数を生成するのはなぜですか?
答え1
このようなものをデバッグする方法は次のとおりです。あなたのスクリプトの簡略化されたバージョンがあります。
$ cat var_dumper.bash
#!/bin/bash
var1=1
var2=2
if [ ! "$var1" > "$var2" ]; then
echo "I'm inside the if/then"
fi
私たちはそれを実行します:
$ ./var_dumper.bash
$ ls
var_dumper.bash 2
2
これにより、ファイルとして表示されるものが表示されます。それはあなたの問題です。
デバッグ
シェルスクリプトをデバッグするには、常に-x
Bashに切り替えて起動します。次のようにスクリプトを実行できます。
$ bash -x ./var_dumper.bash
+ var1=1
+ var2=2
+ '[' '!' 1 ']'
これはどこで失敗したかを教えてくれます。状態if
。それでは、これの問題は何ですか?それから最初の手がかりはです>
。 Bashの他の用途ではリダイレクト演算子であるため、書き込まれるファイルが生成される可能性があります。
それでは、例を単一の実行可能ファイルとして書き直してみましょう。
$ var1=1 var2=2 [ "$var1" > "$var2" ] && echo success || echo failure
success
次の手がかりは成功を返す理由です。 1は2より大きくありません。だから我々はそれをグーグルし、Bashで整数を比較するには演算子を使わずに>
実際に次の演算子を使うべきであることを発見しました-gt
。
$ var1=1 var2=2 [ "$var1" -gt "$var2" ] && echo success || echo failure
failure
もともとは否定されたかったので、元に!
戻すことができます。
$ var1=1 var2=2 [ ! "$var1" -gt "$var2" ] && echo success || echo failure
success
効果があるしたがって、修正されたif
ステートメントは次のようになります。
if [ ! "$var1" -gt "$var2" ]; then
echo "I'm inside the if/then"
fi
それでは何が間違っていますか?>
あなたのシナリオでは、if [ .... ]
この形式のif / thenはPOSIX互換バージョンです。通信会社はサポートしていません>
。サポートされる形式は次のとおりです。if [[ .... ]]
。デュアルブラケットバージョンはより強力です。拡張テスト注文する。
したがって、代わりに:
$ cat var_dumper.bash
#!/bin/bash
var1=1
var2=2
if [[ ! "$var1" > "$var2" ]]; then
echo "I'm inside the if/then"
fi
また働きます:
$ bash -x var_dumper.bash
+ var1=1
+ var2=2
+ [[ ! 1 > 2 ]]
+ echo 'I'\''m inside the if/then'
I'm inside the if/then
引用する
答え2
使用しないでください>デジタルテスト中。リダイレクト演算子だからです。
実行は常にtrueです(ファイルが作成された場合)。
$ if [ 2 > 30000 ]; then echo OK; else echo NO; fi
OK
$ ls
$ 30000
$ rm 30000
そして30,000個のファイルが作成されました。
数値テストは行われませんでしたが、ファイル書き込みが行われ、trueを返しました。
$ mkdir tmp
$ chmod -w tmp
$ cd tmp
$ if [ 2 > 30000 ]; then echo OK; else echo NO; fi
-bash: 30000: Permission non accordée
NO
$ cd ..
$ rmdir tmp
-gtを使用してください。
$ if [ 2 -gt 30000 ]; then echo OK; else echo NO; fi
NO
$ ls