Оценка вывода программы как целое число

В целом я нашел хранение строгого, описательного, соглашения о присвоении имен быть очень полезным. Вам не нужно расширение в Unix, но я сохранил бы его по двум причинам:

1) Если тот файл будет когда-либо читаться машиной окон, будет легче открыться, чем попытка найти "открытым с...".

2) Расширения помогают, Вы, пользователь, выясняете то, что делает файл. В нашей лаборатории: .txt = текстовый файл .sgi = irix скомпилированный двоичный файл .linux = Linux скомпилировал двоичный файл

Если необходимо использовать более старые машины Unix (мы все еще используем IRIX), имейте в виду, что возврат каретки отличается в *, отклоняют машины, и программы не могли бы ценить, при попытке открыть файл с возвратами каретки окон.

0
26.08.2013, 20:53
3 ответа

В ударе переменные являются по существу всеми строками (или массивы строк). Но команда (команды) [] и [[]] имеет несколько операторов, которые рассматривают аргументы как целые числа: - лейтенант - 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 для условного выражения. Они функционируют то же для отдельных операторов, и я склонен использовать && для моих собственных сценариев, но в зависимости от того, кто будет поддерживать сценарий, я склонен быть более подробным/явным.

0
28.01.2020, 05:02
  • 1
    На самом деле, [[ использование поддержек > вместо -gt. Вам только нужно -gt если Вы используете [ потому что > был бы интерпретирован как перенаправление. –  Joseph R. 26.08.2013, 21:16
  • 2
    Но это - лексический вид - [[30> 200]], возвращает true. –  NVRAM 26.08.2013, 21:18
  • 3
    Вы правы. Я думал ((...)). –  Joseph R. 26.08.2013, 21:22
  • 4
    Спасибо за большую справку в этом! Это работало замечательно, хотя я теперь чувствую себя немного неуклюжим. Я не могу заставить список каталогов работать по некоторым причинам, таким образом, я еще раз закончил тем, что перечислил их всех один за другим: if [[ $(/exc/list q show.today1.rundown|wc -l) -gt 200 ]]; then echo "Caution: Today1 rundown has "$(/exc/list q show.today1.rundown|wc -l)" stories in it. Check it out." > /tmp/StoryCount.$date fi Какие-либо мысли? –  Dan Jensen 30.08.2013, 18:47
  • 5
    Согласно Вашему OP/exc/list q DIRNAME должен распечатать число. Извините, но я не знаю тот инструмент. Мой единственный совет является, возможно, заменой q с другим флагом? Но я сомневаюсь, что этот форум будет лучшим местом, чтобы спросить о том инструменте. –  NVRAM 04.09.2013, 17:10

Можно сделать это:

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 никогда не может быть отрицательным; который довольно безопасен, если Вы используете его для подсчета чего-то.

0
28.01.2020, 05:02

Вы могли сохранить свои 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 управляйте в для цикла как так:

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"
0
28.01.2020, 05:02

Теги

Похожие вопросы