Linux-SHELL基础语法

shell基础语法

几种条件判断类型(判断语句基础)

两种判断格式:

  1. [root@localhost ~]# test -e /root/install.log
  2. [root@localhost ~]# [ -e /root/install.log ](推荐)
    • 注意事项:中括号与表达式之间必须有空格,否则报错:[ 表达式 ]

1. 按照文件类型进行判断

测试选项作 用
-b 文件判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)
-c 文件判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
-d 文件判断该文件是否存在,并且是否为目录文件(是目录为真)
-e 文件判断该文件是否存在(存在为真)
-f 文件判断该文件是否存在,并且是否为普通文件(是普通文件为真)
-L 文件判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真)
-p 文件判断该文件是否存在,并且是否为管道文件(是管道文件为真)
-s 文件判断该文件是否存在,并且是否为非空(非空为真)
-S 文件判断该文件是否存在,并且是否为套接字文件(是套接字文件为真)

举例:

# 第一个判断命令如果正确执行,则打印“yes”,否则打印“no”
[ -d /root ] && echo "yes" || echo "no" 

2. 按照文件权限进行判断

测试选项作 用
-r 文件判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)
-w 文件判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)
-x 文件判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)
-u 文件判断该文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真)
-g 文件判断该文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真)
-k 文件判断该文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真)

举例:

# 判断文件是拥有写权限的
[ -w student.txt ] && echo "yes" || echo "no" 

3. 两个文件之间进行比较

测试选项作 用
文件1 -nt 文件2判断文件1的修改时间是否比文件2的新(如果新则为真 newer than
文件1 -ot 文件2判断文件1的修改时间是否比文件2的旧(如果旧则为真 older than
文件1 -ef 文件2判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法

举例:

# 创建个硬链接
ln /root/student.txt /tmp/stu.txt

# 用test测试下,果然很有用
[ /root/student.txt -ef /tmp/stu.txt ] && echo "yes" || echo "no" 
yes

4.两个整数之间的比较

测试选项作 用
整数1 -eq 整数2判断整数1是否和整数2相等(相等为真)
整数1 -ne 整数2判断整数1是否和整数2不相等(不相等位置)
整数1 -gt 整数2判断整数1是否大于整数2(大于为真)
整数1 -lt 整数2判断整数1是否小于整数2(小于位置)
整数1 -ge 整数2判断整数1是否大于等于整数2(大于等于为真)
整数1 -le 整数2判断整数1是否小于等于整数2(小于等于为真)

举例:

[ 23 -ge 22 ] && echo "yes" || echo "no" 
yes
#判断23是否大于等于22,当然是了
[ 23 -le 22 ] && echo "yes" || echo "no" 
no
#判断23是否小于等于22,当然不是了

5. 两个字符串的判断

测试选项作用
-z 字符串判断字符串是否为空(为空返回真 )
-n 字符串判断字符串是否为非空(非空返回真 )
字串1 == 字串2判断字符串1是否和字符串2相等(相等返回真)
字串1 != 字串2判断字符串1是否和字符串2不相等(不相等返回真)

举例:

name=sc
#给name变量赋值
[ -z "$name" ] && echo "yes" || echo "no" 
no
# 判断name变量是否为空,因为不为空,所以返回no



aa=11
bb=22
#给变量aa和变量bb赋值
[ "$aa" == "$bb" ] && echo "yes" || echo "no" 
no
#判断两个变量的值是否相等,明显不相等,所以返回no

6. 多重条件判断(与或非)

测试选项作用
判断1 -a 判断2逻辑与,判断1和判断2都成立,最终的结果才为真
判断1 -o 判断2逻辑或,判断1和判断2有一个成立,最终的结果就为真
!判断逻辑非,使原始的判断式取反

举例:

aa=11
[ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"
no
#判断变量aa是否有值,同时判断变量aa的是否大于23
#因为变量aa的值不大于23,所以虽然第一个判断值为真,返回的结果也是假

aa=24
[ -n "$aa" -a "$aa" -gt 23 ] && echo "yes" || echo "no"
yes

if语句

语法

单分支if语句方式一:
if [ 条件判断式 ];then  
    程序  
fi 
单分支if语句方式二(推荐):
if [ 条件判断式 ]  
    then  
        程序
fi
双分支if条件语句
if [ 条件判断式 ]
    then
        条件成立时,执行的程序
    else
        条件不成立时,执行的另一个程序
fi
多分支if条件语句
if [ 条件判断式1 ]
    then
        当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
    then
        当条件判断式2成立时,执行程序2 „省略更多条件…
else
    当所有条件都不成立时,最后执行此程序
fi

范例

范例1:备份mysql数据库
#!/bin/bash
# 备份mysql数据库。 
# Author: jerry

# 同步系统时间,联网有效
ntpdate asia.pool.ntp.org &>/dev/null


#把当前系统时间按照“年月日”格式赋予变量date
date=$(date +%y%m%d) 

#统计mysql数据库的大小,并把大小赋予size变量
size=$(du -sh /var/lib/mysql) 

if [ -d /tmp/dbbak ]
    then
        echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
        echo "Data size : $size" >> /tmp/dbbak/dbinfo.txt
        cd /tmp/dbbak
        tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
        rm -rf /tmp/dbbak/dbinfo.txt
    else
         mkdir /tmp/dbbak
         echo "Date : $date!" > /tmp/dbbak/dbinfo.txt
         echo "Data size : $size" >> /tmp/dbbak/dbinfo.txt
         cd /tmp/dbbak
         tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
        rm -rf /tmp/dbbak/dbinfo.txt
fi
范例2:判断apache是否启动
#!/bin/bash
# Author: jerry

# 使用nmap命令扫描服务器,并截取apache服务的状态,赋予变量port
port=$(nmap -sT 192.168.1.156 | grep tcp | grep http | awk '{print$2}')

if [ "$port" == "open" ]
    then
        echo “$(date) httpd is ok!” >> /tmp/autostart-acc.log
    else
        /etc/rc.d/init.d/httpd start &>/dev/null
        echo "$(date) restart httpd !!" >> /tmp/autostart-err.log
fi
范例3:判断用户输入的是什么文件(文件/目录)
#!/bin/bash
# 判断用户输入的是什么文件
# Author: jerry

# 接收键盘的输入,并赋予变量file
read -p "Please input a filename: " file

if [ -z "$file" ] # 判断file变量是否为空
    then
        echo "Error,please input a filename"
        exit 1
elif [ ! -e "$file" ] # 判断file的值是否存在
    then
        echo "Your input is not a file!"
        exit 2
elif [ -f "$file" ] # 判断file的值是否为普通文件
    then
        echo "$file is a regulare file!"
elif [ -d "$file" ] # 判断file的值是否为目录文件
    then
        echo "$file is a directory!"
else
    echo "$file is an other file!"
fi

case语句

语法

case $变量名 in 
    "值1")
        如果变量的值等于值1,则执行程序1
        ;;
    "值2")
        如果变量的值等于值2,则执行程序2
        ;;
    …省略其他分支… 
    *)
        如果变量的值都不是以上的值,则执行此程序
        ;;
esac

范例:判断用户输入

#!/bin/bash
#判断用户输入
# Author: jerry

read -p "Please choose yes/no: " -t 30 cho
case $cho in
    "yes")
        echo "Your choose is yes!"
        ;;
    "no")
        echo "Your choose is no!"
        ;;
    *)
        echo "Your choose is error!"
        ;;
esac

for循环

语法

语法一:不知道循环个数(in)
for 变量 in 值1 值2 值3
do 
	程序
done
语法二:知道循环个数
for ((初始值;循环控制调节;变量变化))
   do
   	程序
   done

范例

范例1:批量解压缩
#!/bin/bash

# Author:jerry
# 批量解压缩软件包

cd /lamp
ls *.tar.gz > ls.log  #ls *.tar.gz 输出结果覆盖到ls.log文件
for i in $(cat ls.log)
    do
        tar -zxf $i $>/dev/null
    done
rm -rf /lamp/ls.log
范例2: 批量创建用户
#!/bin/bash

# Author: jerry
# 批量添加新用户

# 输入用户名,等待时间30s
read -p "Please input user name: " -t 30 name  
# 输入创建用户个数,等待时间30s
read -p "Please input the number of users: " -t 30 num  
# 输入用户密码,等待时间30s
read -p "Please input the password of users: " -t 30 pass   

#判断输入信息是否为空
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]       
        then
            # 通过sed命令把所有的数字替换为空
            y=$(echo $num | sed s/'^[0-9]*$'//g)    
                if [ -z "$y" ]  # 如果num为数字,y必为空
                    then
                        for ((i=1;i<=$num;i++)) #开始循环
                            do
                                # 建立用户
                                /usr/sbin/useradd "$name$i" &>/dev/null 
                                # 设置用户密码,与用户名相同
                                echo $pass | /usr/bin/passwd --stdin "$name$i" &>/dev/null      
                            done
                        echo "Build seccees!"
                fi
fi 

while循环与until循环

  • while循环:只要条件成立,循环就会一直继续,条件不成立,循环停止。
  • until循环:与while相反,只要条件不成立,循环一直继续,条件成立,循环结束。

语法

while循环语法
# 语法一
while [ 条件判断式 ]
    do
        程序
    done
    
# 语法二
while:
do
    if [ 条件判断式 ]
        then
            exit
done
until循环语法
until [ 条件判断式 ]
    do
        程序
    done

范例

范例一:从1加到100(while)
#!/bin/bash
# 从1加到100
# Author: jerry

i=1
s=0
# 如果变量i的值小于等于100,则执行循环
while [ $i -le 100 ] 
    do
        s=$(( $s+$i ))
        i=$(( $i+1 ))
    done
echo "The sum is: $s
范例二:从1加到100(until)
#!/bin/bash
# 从1加到100
# Author: jerry

i=1
s=0
# 如果变量i的值小于等于100,则执行循环
until [ $i -gt 100 ] 
    do
        s=$(( $s+$i ))
        i=$(( $i+1 ))
    done
echo "The sum is: $s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值