Скрипты Bash оставьте 4 цифры в покое - PullRequest
0 голосов
/ 07 ноября 2010

РЕДАКТИРОВАТЬ: РЕШЕНО. Спасибо всем!

Я создаю сценарий оболочки и не могу сравнить. Я называю это через ./myscript 1000, где 1000 находится в переменной с именем y.

Проблема в том, что мне нужно сделать так, чтобы, если я передал любой 4-значный номер в мой скрипт, такой как 0001, он не будет изменен моими операторами if, но когда я вызываю мой сценарий, он в основном говорит мне, что 0001 и 1 являются те же вещи. Как я могу проверить размер $ y, чтобы исправить мою проблему?

Я попытался повторить y, он показывает 0001 и 1, когда я передаю их в свой сценарий, но я не знаю, как оставить любое 4-значное число в покое.

####CODE SNIPP
#NOT EVEN NEEDED, JUST FOR SHOW, need to think of 0000 to any 4 digit # 
#as different, but not sure how to do it.
if [ "$y" -ge 0000 ] && [ "$y" -le 9999 ]
then
        #DO NOTHING

#IF Y <= 50 && Y >= 0
elif [ "$y" -le 50 ] && [ "$y" -ge 0 ]
then
        #DO SOMETHING

#IF Y > 50 && Y <= 99
elif [ "$y" -gt 50 ] && [ "$y" -le 99 ]
then
        #DO SOMETHING
fi

У кого-нибудь есть советы, как я могу сказать, что сценарий 0001 и 1 - это две разные вещи? Я считаю, что bash должен что-то проверить длину ввода или что-то, но я ничего не могу найти.

Ответы [ 3 ]

1 голос
/ 07 ноября 2010

Bash поддерживает поиск длины строки, хранящейся в переменной.

A=hello
echo ${#A}    # outputs "5"

Это можно использовать в операторе if:

A=0001
if [ ${#A} -ne 4 ]; then
    # stuff done if not four digits
fi
1 голос
/ 07 ноября 2010

Я бы обозначил 4-значные числа, используя case:

case $y in
([0-9][0-9][0-9][0-9])
    is_4_digits=yes;;
(*) is_4_digits=no;;
esac

Что еще вы делаете, зависит от ваших требований - возможно, вы делаете все в предложении '(*)'; Я бы использовал ': OK' в 4-значном случае, чтобы указать, что этот случай в порядке:

case $y in
([0-9][0-9][0-9][0-9]) : OK;;
(*) # ... do all the other work here ...
    ;;
esac
1 голос
/ 07 ноября 2010

Обратите внимание, что bash будет рассматривать любые аргументы -eq, -ne, -lt, -le, -gt или -ge как числа.

Если вы хотите рассматривать их как строку, используйте = и! =

$ test 1 = 2; echo $?
1
$ test 1 = 1; echo $?
0
$ test 1 = 001; echo $?
1
$ 

Обратите внимание, что 1 и 001 считаются разными.Может ли это помочь вам на вашем пути.

Если вы действительно хотите узнать, что-то долго, попробуйте использовать wc?

$ echo -n abc | wc -c
3
$ y=0001
$ echo -n $y | wc -c
4
$ test `echo -n $y | wc -c` -eq 4; echo $?
0
$ y=1
$ test `echo -n $y | wc -c` -eq 4; echo $?
1
$

В последнем случае возвращается 1, сообщая нам, чтоДлина 1013 * не 4 символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...