コマンドラインの出力を評価してから200より大きい場合は、印刷するスクリプトを作成しようとしています。
このプログラムは、/exc/list
ディレクトリ内の「ストーリー」の数を式として数えます。たとえば、
/exc/list q show.today1.rundown
Today1リストに161個のストーリーがある場合、161個が返されます。
私は23の異なるディレクトリに対してこの値を計算する必要がありました。ストーリーの数が200を超える場合は、一時ファイル(/tmp/StoryCount.$date
)で印刷する必要があります。
この比較を処理する最良の方法は何ですか?
答え1
存在する強く打つ、変数は本質的に文字列(または文字列の配列)です。しかし、[ ]そして[[ ]]このコマンドには、引数を整数として扱う複数の演算子があります。 -lt -le -eq -ne -ge -gt
したがって、次のものを使用できます。
for dir in ${LIST_OF_DIRECTORIES}; do
if [[ $(/exc/list q ${dir}) -gt 200 ]]; then
echo "${dir}"
fi
done > /tmp/StoryCount.$(date +%y%m%d)
ディレクトリ名にスペースが含まれている場合は、そのまま機能しません。
また、&&
明示的な条件の代わりに別の答えを使用しますif
。彼らは単一のステートメントに対して同じように機能し、&&
私のスクリプトで使用する傾向がありますが、スクリプトを維持する人によってはより冗長で明示的な傾向があります。
答え2
次のことができます。
num=$(/exc/list q show.today1.rundown) #store command output in num
#sanitize num so the comparison doesn't break:
num=${num//\.[0-9]/} #remove numbers after a decimal point
num=${num//[^0-9]/} #remove any non-digit character
#if num is greater than 200 print it to a temporary file:
[ "$num" -gt 200 ] && printf "%d\n" "$num" > "/tmp/StoryCount.$(date)"
もちろん、これはnum
負数が決してないと仮定します。これを使って何かを計算すると、かなり安全です。
答え3
次のように、bashの配列に23のディレクトリを保存できます。
$ dirs=(show.today1.rundown show.today2.rundown)
-or-
$ dirs=(\
show.today1.rundown \
show.today2.rundown \
)
次に、次のように繰り返します。
$ for dir in "${dirs[@]}"; do echo "$dir";done
show.today1.rundown
show.today2.rundown
/exc/list
その後、次のようにコマンドをforループに統合できます。
dateStamp=$(date +"%F_%T")
for dir in "${dirs[@]}"; do
cnt=$(/exc/list q $dir)
[ "$cnt" -gt 200 ] && printf "%d\n" "$cnt"
done | tee "/tmp/StoryCount.$dateStamp"