#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