1.模拟linnux登录shell

#/bin/bash
echo -n "login:"
read name
echo -n "password:"
read passwd
if [ $name = "cht" -a $passwd = "abc" ];then
echo "the host and password is right!"
else echo "input is error!"
fi

2.比较两个数大小

#/bin/bash
echo "please enter two number"
read a
read b
if test $a -eq $b
then echo "NO.1 = NO.2"
elif test $a -gt $b
then echo "NO.1 > NO.2"
else echo "NO.1 < NO.2"
fi

3.查找/root/目录下是否存在该文件

#/bin/bash
echo "enter a file name:"
read a
if test  -e /root/$a
then echo "the file is exist!"
else echo "the file is not exist!"
fi

4.for循环的使用

#/bin/bash
clear
for num in 1 2 3 4 5 6 7 8 9 10
do
    echo "$num"
done

5.命令行输入

#/bin/bash
echo "Please enter a user:"
read a
b=$(whoami)
if test $a = $b
then echo "the user is running."
else echo "the user is not running."
fi

6.删除当前目录下大小为0的文件

#/bin/bash
for filename in `ls`
do
    if test -d $filename
    then b=0
    else   
       a=$(ls -l $filename | awk '{ print $5 }')
            if test $a -eq 0
             then rm $filename
             fi
        fi     
done

7.如果/export/um_lpp_source下有文件,那么将其文件系统大小改为3G

 #/bin/bash
while line=`ls /export/um_lpp_source`
do
        if test $line=""
        then  echo "NULL"
             sleep 1
    else echo $line
                chfs -a size=3G /export/um_lpp_source
                 exit 0
        fi
done

8.测试IP地址

#/bin/bash
for i in  1 2 3 4 5 6 7 8 9
do
    echo "the number of $i computer is "
    ping -c 1 192.168.0.$i
done

9.如果test.log的大小大于0,那么将/opt目录下的*.tar.gz文件

 #/bin/sh
a=2
while name="test.log"
do
        sleep 1
        b=$(ls -l $name | awk '{print $5}')
        if test $b -ge $a
        #then echo "OK"
    then `cp /opt/*.tar.gz .`
        exit 0
        fi
done

10.打印读取的内容,为下面的例子做准备

#/bin/bash
while read name
do
echo $name
done

11.从0.sh中读取内容并打印

#/bin/bash
while read line
do
    echo $line
done < 0.sh

12.读取a.c中的内容并做加1运算

#/bin/bash
test -e a.c
while read line
do
    a=$(($line+1))
done < a.c
echo $a

13.普通无参数函数

#/bin/bash
p ()
{
    echo "hello"
}
p

14.给函数传递参数

#/bin/bash
p_num ()
{
    num=$1
    echo $num
}
for n in $@
do
    p_num $n
done

15.创建文件夹

#/bin/bash
while :
do
    echo "please input file's name:"
    read a
    if test -e /root/$a
    then
         echo "the file is existing Please input new file name:"
    else
        mkdir $a
        echo "you aye sussesful!"
        break
    fi
done

16.获取本机IP地址

#/bin/bash
ifconfig | grep "inet addr:" | awk '{ print $2 }'| sed 's/addr://g'

17.查找最大文件

#/bin/bash
a=0
for  name in *.*
do
     b=$(ls -l $name | awk '{print $5}')
    if test $b -ge $a
    then a=$b
         namemax=$name
     fi
done
echo "the max file is $namemax"

18.查找当前网段内IP用户,重定向到ip.txt文件中

#/bin/bash
a=1
while :
do
    a=$(($a+1))
    if test $a -gt 255
    then break
    else
        echo $(ping -c 1 192.168.0.$a | grep "ttl" | awk '{print $4}'| sed 's/://g')
        ip=$(ping -c 1 192.168.0.$a | grep "ttl" | awk '{print $4}'| sed 's/://g')
        echo $ip >> ip.txt
    fi
done

19.打印当前用户

#/bin/bash
echo "Current User is :"
echo $(ps | grep "$$" | awk '{print $2}')

20.case语句练习

#!/bin/bash
clear
echo "enter a number from 1 to 5:"
read num
case $num in
    1) echo "you enter 1"
    ;;
    2) echo "you enter 2"
    ;;
    3) echo "you enter 3"
    ;;
    4) echo "you enter 4"
    ;;
    5) echo "you enter 5"
    ;;
    *) echo "error"
    ;;
esac

21.yes/no返回不同的结构

#!/bin/bash
clear
echo "enter [y/n]:"
read a
case $a in
    y|Y|Yes|YES) echo "you enter $a"
    ;;
    n|N|NO|no) echo "you enter $a"
    ;;
    *) echo "error"
    ;;
esac

22.杀进程

 #/bin/bash
pid=`ps -ef | grep '进程相关内容' | grep -v 'grep' | awk '{ print $2}'`
if [ -n "$pid" ]; then
        kill -9 $pid
fi

 23.内置命令的使用

#/bin/bash

    clear


        echo "Hello, $USER"
        echo

                echo "Today 's date id `date`"

        echo

        echo "the user is :"


        who
        echo

        echo "this is `uname -s`"


        echo

        echo "that's all folks! "

24.

25.

#/bin/bash

26.打印无密码用户

#/bin/bash
echo "No Password User are :"
echo $(cat /etc/shadow | grep "!!" | awk 'BEGIN { FS=":" }{print $1}')

27.

#/bin/bash

    clear


        echo "Hello, $USER"
        echo

                echo "Today 's date id `date`"

        echo

        echo "the user is :"


        who
        echo

        echo "this is `uname -s`"


        echo

        echo "that's all folks! "

28.检查端口号是否已启动

#!/bin/bash

n=1

echo "检查xxx服务..."

while true

do

        if test $n -gt 20

        then

                echo "xxx服务启动失败"

                break

        fi

                        sleep 5

        n=$(($n+1))

        port=`netstat -antp | grep "0.0.0.0:8080"`

        if [ ${#port} -gt 3 ]; then

                echo "xxx服务已经启动"

                break;

        fi

done

 

 

 

 

 

===============

从今天开始,starfe就将自己平时在书写shell脚本过程中的经历做一总结,力图形成一个系列---“书写优雅的shell脚本”。

在此,对“优雅”一词的定义有4点:(1)健壮;(2)结构清晰;(3)性能好;(4)力求简单。


好了,废话不多说,开始今天的主题:if语句

1. if判断式

(1)

if [ 条件判断一 ] &&(||) [ 条件判断二 ]; then

xxx

fi

(2)

if [ 条件判断一 ] &&(||) [ 条件判断二 ]; then

xxx

else

xxx

fi

(3)

if [ 条件判断一 ] &&(||) [ 条件判断二 ]; then

xxx

elif [ 条件判断三 ] &&(||) [ 条件判断四 ]; then

xxx

...

else 

xxxx

fi

2. if中的二元比较

2.1 整数比较

     -eq 等于,如:if [ $a -eq $b ]

     -ne 不等于,如:if [ $a -ne $b ]

     -gt 大于,如:if [ $a -gt $b ]

     -ge 大于等于,如:if [ $a -ge $b ]

     -lt 小于,如:if [ $a -lt $b ]

     -le 小于等于,如:if [ $a -le $b ]

     >大于,如:[ $a > $b ]

     >= 大于等于,如:[ $a >= $b ]

     注:以上其实不是健壮的代码,上面这些代码在有些情况下会存现错误提示,而真正健壮的是使用双括号来表示,即if [[ $a -eq $b ]]

这是为何?做个测试如下:

$>a=;b=3;

$>if [ a -gt $b ]; then echo "true";fi

-bash: [: -gt: unary operator expected  //报错

  而改为$>if [[ a > 3 ]]; then echo "true";fi  //不再报错,这也是我们所期望的

究其原因,是因为如果变量a值为空(由于shell是弱类型语言,对变量赋值都是当字符串对待),那么就成了 [ -gt 3 ] ,显然 [ 和 $b 不相等并且缺少了 [ 符号,所以报了这样的错误。当然不总是出错,如果变量a值不为空,程序就正常了,所以这样的错误还是很隐蔽的。

    或者用下面的方法也能避免这种错 误:if [ "$a"x -gt "$b"x ]; then   echo "true"; fi。当然,x也可以是其他字符。顺便提一点,shell中有没有双引号在很多情况下是一致的。

2.2 字符串比较

 

等于,如:if [ $a = $b ]或if [ $a == $b ],与=等价

不等于,如:if [ $a != $b ]

大于,在ASCII字母顺序下.如:if [ $a \> $b ]

小于,在ASCII字母顺序下.如:if [ $a \< $b ] 注意:要使用转义符“\”。

2.3 文件比较

[ 文件1 -nt 文件2 ] 为真 如果 文件1 has been changed more recently than 文件2, or 如果文件1 存在 而且文件2 does not。
[ 文件1 -ot 文件2 ] 为真 如果 文件1 比 文件2 旧, 或者 文件2 存在而且 文件1 不存在。
[ 文件1 -ef 文件2 ] 为真 如果 文件1 而且 文件2 refer to the same device 而且 inode numbers。

2.4 表达式比较

[ 表达式1 -a 表达式2 ] 如果表达式1 而且表达式2 同时为真则为真 。
[ 表达式1 -o 表达式2 ] 如果表达式1 或者表达式2 其中之一为真则为真。

3.if中的一元比较

[ -a 文件 ] 如果文件存在为真。
[ -b 文件 ] 如果 文件 存在 而且 是一个 块-特殊 文件为真。
[ -d 文件 ] 为真 如果 文件 存在 而且 是一个 目录。



[ ! EXPR ] 如果EXPR 为假则为真。
[ ( EXPR ) ] 返回EXPR 的值。 这样可以用来忽略正常的操作符优先级。
posted on 2016-10-08 12:05  阚壠  阅读(220)  评论(0)    收藏  举报