что не так с написанным мной сценарием оболочки

#shell #unix #awk #ksh

#оболочка #unix #awk #ksh

Вопрос:

Вот сценарий оболочки, который я написал.

 file_sequence=998
while [ $file_sequence -ne 000 ]
do
  file_sequence=`printf {"dn",$((file_sequence   1))}`;
  if [ $file_sequence -gt 999 ]
    then
    file_sequence=`printf {"dn",1}`;
 fi
done
  

Проблема здесь в том, что я получаю следующий вывод

 999
001
002
003
upto ..... 009 and then
010
009
010
009
  

Может кто-нибудь, пожалуйста, рассказать, что здесь происходит.? Заранее спасибо

Комментарии:

1. Ваш скрипт отлично работает для меня, хотя мне пришлось добавить echo $file_sequence непосредственно перед done оператором, чтобы действительно увидеть какой-либо вывод. Вы пропустили какую-либо часть своего сценария? У вас есть строка #!/bin/ksh в верхней части вашего скрипта?

2. Привет, попробуйте это file_sequence=010 теперь попробуйте выполнить это file_sequence= printf {"dn",$((file_sequence 1))} ; Вы получите 009, а не 011 🙂

3. Если вы запустите ksh перед вводом этих команд, вы получите 011. Если ваша оболочка по умолчанию не ksh является и вы вводите эти команды, то вы получите 009. Моя оболочка по умолчанию bash и ввод этих команд приводит к неправильным результатам, но если я запускаю ksh первым, я получаю правильный результат.

4. Сравните выходные данные из echo $((10)) , echo $((010)) , и echo $((10#010)) и вы увидите проблему. Подсказка: восьмеричный. (Эти команды предназначены для bash, я не знаю, поддерживает ли ksh базовый префикс. Но, учитывая некоторые другие комментарии, вы на самом деле не используете ksh, если у вас есть эта проблема в первую очередь.)

5. then Часть без необходимости вызывает printf статическое назначение. Просто скажите file_sequence=001 .

Ответ №1:

Целые числа, начинающиеся с 0 , рассматриваются как восьмеричные. 010 в восьмеричном — это 8 в десятичном. 8 1 равно 9. Я думаю, что более чистым решением является использование переменной, которая отслеживает индекс, и отдельной переменной, которая заботится о форматировании:

 #!/bin/sh

i=998
while test "$i" -ne 0
do
  test $((  i)) -gt 999 amp;amp; i=1
  file_sequence=$(printf "d" $i)
  echo $file_sequence
done
  

Комментарии:

1. 1 на месте! Это должно быть принятым ответом. Возможно, предоставить более простой обходной путь, чем bc ? Я имею в виду базовую нотацию, если она доступна в ksh , или просто обрезку любых начальных нулей из присваивания.

Ответ №2:

Я думаю, что вы используете file_sequence в сочетании с другой строкой, которую вы хотите зарегистрировать. Ваш текущий сценарий будет выполняться вечно. В настоящее время вы постоянно преобразуете file_sequence между строкой и целым числом, что вызывает проблему. Создайте функцию журнала для подсчета:

 #!/bin/ksh
function my_log
{
  (( file_sequence_nr = file_sequence_nr   1 ))
  if [ ${file_sequence_nr} -gt 999 ]
  then
    file_sequence_nr=1
  fi
  printf "d %sn" ${file_sequence_nr} "$*"

done

export file_sequence_nr=998
# Loop input file, here a test until 20
while [ $file_sequence_nr -ne 20 ]
do
  my_log "Logline random $RANDOM"
  sleep 1 # Always have a sleep 1 in a while loop until you are sure it works.
done
  

Ответ №3:

Я не знаю, в чем проблема, но я знаю способ обойти.

Попробуйте это:

 file_sequence=998
while [ $file_sequence -ne 000 ]
do
  file_sequence=$(printf {"dn",$(bc <<< "$file_sequence   1")});
  if [ $file_sequence -gt 999 ]
    then
    file_sequence=$(printf {"dn",1});
 fi
   echo "$file_sequence"
done
  

выполнение:

 bash script.sh  | head -15
999
001
002
003
004
005
006
007
008
009
010
011
012
013
014
  

Комментарии:

1. Запрашивающий пытается использовать ksh .

2. Привет, Тьяго, я попробовал ваше предложение с помощью #!/bin/ksh, и оно работает нормально. Итак, этот сценарий должен быть ok rite.?

3. Привет, Тьяго, у меня тоже были сомнения, как предположил Уильям Перселл, как вам удалось преодолеть восьмеричную часть в этом коде, не могли бы вы объяснить.? Просто хотел понять, как это работает. Спасибо

4. Я преодолел, $(bc <<< "$file_sequence 1") как я уже сказал, я не знал, почему он не работает, приятно знать, что это потому, что он рассматривается как восьмеричный 🙂 Кстати, bc — это калькулятор командной строки, который вы, вероятно, будете использовать, если хотите выполнять вычисления с плавающими числами.

Ответ №4:

Добавьте это в начало вашего скрипта, чтобы заставить скрипт запускаться с помощью ksh :

 #!/bin/ksh