Bashスクリプトを実行すると、数値変数がディレクトリに表示されます。

Bashスクリプトを実行すると、数値変数がディレクトリに表示されます。

ディレクトリにBashスクリプトを作成しました。私がそれを実行して "ls"すると、ディレクトリレベルに数字が表示され、 "rm"を使用して削除する必要があります。

このBashスクリプトの目的は、現在のファイルをディレクトリに保存し、保存された古い行数を取得し、ファイルlogstore.txtnumlines.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これにより、ファイルとして表示されるものが表示されます。それはあなたの問題です。

デバッグ

シェルスクリプトをデバッグするには、常に-xBashに切り替えて起動します。次のようにスクリプトを実行できます。

$ 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

引用する

おすすめ記事