Странная вещь происходит в простой программе CShell


Эй, ребята, у меня есть эта странная ошибка, и я понятия не имею, как ее исправить, был бы очень рад, если бы вы могли помочь.

#!/bin/tcsh -f
set date = ${1}
set time = ${2}
echo 1
set month = `echo $date | cut -f1 -d"-"`
set day = `echo $date | cut -f2 -d"-"`
set year = `echo $date | cut -f3 -d"-"`
echo $date $month $day $year
echo $date $time
if ($year > 69) then
    @ year = $year + 1900
else
    @ year = $year + 2000
endif   
echo 3
if ($month == "Jan") set month = 01
if ($month == "Feb") set month = 02
if ($month == "Mar") set month = 03
if ($month == "Apr") set month = 04
if ($month == "May") set month = 05
if ($month == "Jun") set month = 06
if ($month == "Jul") set month = 07
if ($month == "Aug") set month = 08
if ($month == "Sep") set month = 09
if ($month == "Oct") set month = 10
if ($month == "Nov") set month = 11
if ($month == "Dec") set month = 12
echo 4
set hour1 = `echo $time | cut -c1`
set hour2 = `echo $time | cut -c2`
set min1 = `echo $time | cut -c4`
set min2 = `echo $time | cut -c5`
set ampm = `echo $time | cut -c6`
echo $hour1 #$hour2 $min1 $min2

if ($ampm =~ [pP]) then
    @ hour1 = $hour1 + 1
    @ hour2 = $hour2 + 2
endif

if ($day < 10) then
    printf "%s%s0%s%s%s%s%s" $year $month $day $hour1 $hour2 $min1 $min2
else
    printf "%s%s%s%s%s%s%s" $year $month $day $hour1 $hour2 $min1 $min2
endif

В основном программа получает 2 аргумента, например Sep-22-07 11:45am и возвращает его в таком формате yyyymmddhhmm - 200709071145

Теперь странная вещь происходит, когда я посылаю 2-й параметр с двумя нулями в начале, вот так ... 00: 01, например. тогда весь установленный месяц, установленный день, установленный год начинает сходить с ума и возвращает мне это вывод:
0.000u 0.001s 0:00.00 0.0%      0+0k 0+0io 0pf+0w
0.000u 0.001s 0:00.00 0.0%      0+0k 0+8io 0pf+0w
0.000u 0.001s 0:00.00 0.0%      0+0k 0+0io 0pf+0w

+ другой вывод.

В программе есть и другие эхо, но я просто использовал их для отладки.

В любом случае, заранее спасибо. Я вроде как новичок в CShell, так что если это какая-то легкая ошибка, мне жаль, но я не могу ее найти.

2 2

2 ответа:

Команда set time (без аргументов) в tcsh используется для включения синхронизации каждой команды, выполняемой оболочкой. Это источник дополнительного вывода, который вы видите. По-видимому

set time = 00:01am

Или подобное имеет тот же эффект - я не знаю, почему ведущее "00:" имеет значение, но это легко воспроизводится в командной строке.

Поскольку вы упомянули, что вы новичок в C shell, я чувствую себя несколько вынужденным направить вас к этой статье Тома Кристиансена:

Csh Программирование Считается Вредным

Многие программисты предпочитают использовать оболочку Bourne shell или одну из ее производных (ksh, bash...) для неинтерактивных сценариев, чтобы избежать многих проблем, описанных в приведенной выше статье.

Установленное время = x; позволяет пользователям устанавливать пороговое значение для времени регистрации команд. Если этот порог установлен на низком уровне, он будет выполнять все команды, которые занимают больше времени, чем этот порог. Если x установлено в относительно высокое число, то только те, которые превышают этот порог, синхронизируются и производят выход, который вы видите, следовательно, именно поэтому вы видите его только тогда,когда вы устанавливаете время на число 00:. Как он справляется с форматом времени, который вы используете, и переводит его в секунды, однако, выходит за рамки мое понимание этого.