тестовая команда в KornShell (ksh) - PullRequest
3 голосов
/ 27 октября 2010

У меня есть вопрос по тестовой команде в KornShell (ksh). Я знаю, -ne для сравнения целых чисел и != для сравнения строк. Как поведет себя тестовая команда, если один аргумент является строкой, а другой - целым числом? В моем коде ниже условия, и оба работают правильно.

Код:

myCount=1
myCount=`expr $myCount+ 0`
temp=`ps -aef | grep damn | wc -l`
if [ $temp -ne $myCount]; then
        echo ERROR Number
fi

if [ $temp != $myCount ]; then
        echo ERROR Strings
fi

Выход:

ERROR Number
ERROR Strings

Ответы [ 3 ]

1 голос
/ 26 февраля 2014

Но ваш код в любом случае имеет недостатки.

температура = ps -aef | grep damn | wc -l всегда будет возвращать как минимум 1, так как он найдет команду grep, а также строку, дополненную пробелами, поэтому оба ваших теста верны.

Трубопровод к wc также не нужен, так как ключ -c от grep заменит вас.

лучший код будет:

Темп = ps -aef |grep damn |grep -cv grep который вернет число запущенных экземпляров процессов, содержащих чертову строку, и это будет число.

1 голос
/ 27 октября 2010

Тип не имеет значения, потому что это простая текстовая подстановка.Другими словами, значение переменной $temp будет подставлено вместо $temp (например).

По крайней мере для версии ksh, которую я использую, для числового сравнения, если значение начинается с нечислового значения, оно будет равняться 0. Если оно начинается с числового значения, но содержит нечисловые значения, вы получите сообщение об ошибке.

Например:

$ export s1=xyz
$ export s2=7xyz
$ export i1=0
$ if [ $i1 -eq $s1 ]
> then
>     echo equal
> fi
equal
$ if [ $i1 -eq $s2 ]
> then
>     echo equal
> fi
ksh: 7xyz: bad number `7xyz'

Однако, исходя из ваших комментариев, это может быть не так для всех версий ksh.

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

0 голосов
/ 27 октября 2010

Используя ksh93 и GNU coreutils expr 7.4 ваша команда:

myCount=`expr $myCount+ 0`

выдает синтаксическую ошибку и устанавливает myCount в ноль, что приводит к выводу обоих операторов if "ksh: [:Ожидаемый аргумент "ошибки.Попробуйте поставить пробел перед знаком плюс.Кроме того, перед ].

должен быть пробел. Вам не нужно преобразовывать myCount или temp в целые числа.Приведение myCount с использованием expr совершенно не нужно.

Я предпочитаю эту форму для сравнения целых чисел, поскольку она позволяет использовать символические операторы сравнения, такие как != и > вместо -neи -gt:

if (( $temp != $myCount ))
...