将程序的输出评估为整数

将程序的输出评估为整数

我正在尝试创建一个脚本来评估命令行的输出,然后在它大于 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"

相关内容