我正在尝试创建一个脚本来评估命令行的输出,然后在它大于 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
您可以将 23 个目录存储在 bash 中的数组中,如下所示:
$ 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"