2013-02-27 3 views
2

Для нижеприведенного сценария я ожидаю, что выход будет msg_y and msg_z. Но это печать msg_x and msg_z. Может кто-нибудь объяснить мне, что происходит?Неожиданный вывод в сценарии оболочки bash

#!/bin/bash 
set -x 

vr=2 
echo $vr 
if [ $vr > 5 ] 
then 
     echo "entered 1st if" 
     echo "msg_x" 

     echo "out of 1st if" 

     if [ $vr < 8 ]; then 
     echo "in of 2nd if" 
     echo "msg_y" 

     else 
     echo "msg_z" 
     fi 

else 
     if [ $vr > 1 ]; then echo "msg_y" 

     else echo "msg_z" 
     fi 
fi 

ответ

6

Это выражение

[ $vr > 5 ] 

в настоящее время анализируется в качестве выходного перенаправления; проверьте, есть ли у вас файл с именем «5». Выходное перенаправление пусто. Обратите внимание, что обычные рекомендации для цитирования параметров внутри тестового выражения здесь не помогли бы (но это все же хорошая идея).

Вы можете избежать > так, что она рассматривается как оператор в команде тест:

if [ "$vr" \> 5 ]; then 

или вы можете использовать оператор целое сравнения -gt

if [ "$vr" -gt 5 ]; then. 

Поскольку вы используете bash , вы можете использовать более надежные условное выражение

if [[ $vr > 5 ]]; then 

или

if [[ $vr -gt 5 ]]; then 

или использовать арифметическое выражение

if ((vr > 5)); then 

сделать ваши сравнения (аналогично для остальные).


Примечание: хотя я показал, как сделать > работу в качестве оператора сравнения даже в окружении целых, не делают этого. В большинстве случаев вы не получите желаемых результатов, поскольку аргументы сравниваются лексикографически, а не численно. Попробуйте [ 2 \> 10 ] && echo What? Используйте либо правильные операторы сравнения целого числа (-gt и др.), Либо используйте арифметическое выражение.

+0

такой надежный ответ! – TopGunCoder

+0

Так много возможных решений! :) – chepner

+0

Это очень четкое объяснение. Ценить это. И да, создается файл под названием «5». – itsh

Смежные вопросы