сделайте …, в то время как или делают … до в сценарии оболочки POSIX

Если количество логических процессоров является дважды количеством ядер, у Вас есть HT. Используйте для следующего сценария для декодирования/proc/cpuinfo:

#!/bin/sh
CPUFILE=/proc/cpuinfo
test -f $CPUFILE || exit 1
NUMPHY=`grep "physical id" $CPUFILE | sort -u | wc -l`
NUMLOG=`grep "processor" $CPUFILE | wc -l`
if [ $NUMPHY -eq 1 ]
  then
    echo This system has one physical CPU,
  else
    echo This system has $NUMPHY physical CPUs,
fi
if [ $NUMLOG -gt 1 ]
  then
    echo and $NUMLOG logical CPUs.
    NUMCORE=`grep "core id" $CPUFILE | sort -u | wc -l`
    if [ $NUMCORE -gt 1 ]
      then
        echo For every physical CPU there are $NUMCORE cores.
    fi
  else
    echo and one logical CPU.
fi
echo -n The CPU is a `grep "model name" $CPUFILE | sort -u | cut -d : -f 2-`
echo " with`grep "cache size" $CPUFILE | sort -u | cut -d : -f 2-` cache"
17
03.01.2013, 01:29
2 ответа

Очень универсальная версия do ... в то время как имеет следующую структуру:

while 
      Commands ...
do :; done

Пример:

#i=16
while
      echo "this command is executed at least once $i"
      : ${start=$i}              # capture the starting value of i
      # some other commands      # needed for the loop
      (( ++i < 20 ))             # Place the loop ending test here.
do :; done
echo "Final value of $i///$start"
echo "The loop was executed $(( i - start )) times "

Как есть (для не задано значение i ) цикл выполняется 20 раз.
UN-Комментарий к строке, которая устанавливает i равным 16 i = 16 , цикл выполняется 4 раза.
Для i = 16 , i = 17 , i = 18 и i = 19 .

Если i установлен в (скажем, 26) в той же точке (начале), команды все равно будут выполняться в первый раз (до тех пор, пока не будет проверена команда прерывания цикла).

Тест какое-то время должен быть правдивым (статус выхода 0).
Тест должен быть отменен для цикла до, т. Е .: быть ложным (статус выхода не равен 0).

Для работы версии POSIX необходимо изменить несколько элементов:

i=16
while
       echo "this command is executed at least once $i"
       : ${start=$i}              # capture the starting value of i
       # some other commands      # needed for the loop
       i="$((i+1))"               # increment the variable of the loop.
       [ "$i" -lt 20 ]            # test the limit of the loop.
do :;  done
echo "Final value of $i///$start"
echo "The loop was executed $(( i - start )) times "

./script.sh
this command is executed at least once 16
this command is executed at least once 17
this command is executed at least once 18
this command is executed at least once 19
Final value of 20///16
The loop was executed 4 times 
16
27.01.2020, 19:46

Нет..., в то время как или действительно... до циклично выполняются, но то же самое может быть выполнено как это:

while true; do
  ...
  condition || break
done

поскольку до:

until false; do
  ...
  condition && break
done
17
27.01.2020, 19:46
  • 1
    Можно использовать любую из строк повреждения или с циклов - в то время как верный или до лжи просто означают 'навсегда'. Я понимаю, что это отчасти сохраняет в-то-время-как-мыс или до-мыс, чтобы иметь счастливый выход условия или печальный выход. –  android.weasel 04.12.2015, 19:26

Теги

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