2010-11-07 69 views
0

编辑:已解决。谢谢大家!Bash脚本只留下4位数字

我正在构建一个shell脚本,我坚持比较。我通过./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必须有一些东西来检查输入长度或什么,但我找不到任何东西。

回答

1

Bash支持查找存储在变量中的字符串的长度。

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

您可以使用此if语句中:

A=0001 
if [ ${#A} -ne 4 ]; then 
    # stuff done if not four digits 
fi 
1

请注意,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通知我们,$y不长4个字符。

+0

不需要wc;如果y = 1000,$ {#y}将会是4 – 2010-11-07 04:42:30

+0

向你的bash-foo鞠躬。 :-) 谢谢!这会派上用场。 – Ashe 2010-11-07 05:01:01

1

我使用case识别4位数字:

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

您做些什么取决于您的要求 - 可能是你在'(*)'条款中做了所有事情;我在4位数字的情况下使用': OK'表示这种情况是OK的:

case $y in 
([0-9][0-9][0-9][0-9]) : OK;; 
(*) # ... do all the other work here ... 
    ;; 
esac