프로그램의 출력을 정수로 평가

프로그램의 출력을 정수로 평가

명령줄의 출력을 평가한 다음 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"

관련 정보