博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux-SHELL基础语法
阅读量:4188 次
发布时间:2019-05-26

本文共 6490 字,大约阅读时间需要 21 分钟。

文章目录

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变量是否为空,因为不为空,所以返回noaa=11bb=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成立时,执行程序1elif [ 条件判断式2 ]    then        当条件判断式2成立时,执行程序2 „省略更多条件…else    当所有条件都不成立时,最后执行此程序fi

范例

范例1:备份mysql数据库

#!/bin/bash# 备份mysql数据库。 # Author: jerry# 同步系统时间,联网有效ntpdate asia.pool.ntp.org &>/dev/null#把当前系统时间按照“年月日”格式赋予变量datedate=$(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.txtfi

范例2:判断apache是否启动

#!/bin/bash# Author: jerry# 使用nmap命令扫描服务器,并截取apache服务的状态,赋予变量portport=$(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.logfi

范例3:判断用户输入的是什么文件(文件/目录)

#!/bin/bash# 判断用户输入的是什么文件# Author: jerry# 接收键盘的输入,并赋予变量fileread -p "Please input a filename: " fileif [ -z "$file" ] # 判断file变量是否为空    then        echo "Error,please input a filename"        exit 1elif [ ! -e "$file" ] # 判断file的值是否存在    then        echo "Your input is not a file!"        exit 2elif [ -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: jerryread -p "Please choose yes/no: " -t 30 chocase $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 值3do 	程序done

语法二:知道循环个数

for ((初始值;循环控制调节;变量变化))   do   	程序   done

范例

范例1:批量解压缩

#!/bin/bash# Author:jerry# 批量解压缩软件包cd /lampls *.tar.gz > ls.log  #ls *.tar.gz 输出结果覆盖到ls.log文件for i in $(cat ls.log)    do        tar -zxf $i $>/dev/null    donerm -rf /lamp/ls.log

范例2: 批量创建用户

#!/bin/bash# Author: jerry# 批量添加新用户# 输入用户名,等待时间30sread -p "Please input user name: " -t 30 name  # 输入创建用户个数,等待时间30sread -p "Please input the number of users: " -t 30 num  # 输入用户密码,等待时间30sread -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!"                fifi

while循环与until循环

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

语法

while循环语法

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

until循环语法

until [ 条件判断式 ]    do        程序    done

范例

范例一:从1加到100(while)

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

范例二:从1加到100(until)

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

转载地址:http://uwsoi.baihongyu.com/

你可能感兴趣的文章
三种不同的程序员,你属于哪一种?如果要裁员,你会让谁走?
查看>>
干货神总结,程序员面试技巧
查看>>
深度解析BAT三家互联网公司,为什么腾讯产品第一,百度技术第一,阿里运营第一?
查看>>
程序员发贴求助:剪短头发能缓解脱发吗?网友:我觉得秃头挺好的
查看>>
史上最难程序员的面试题!谷歌、百度、微软、阿里必答题
查看>>
为什么会出现“程序员千万不要学算法”这种言论?
查看>>
程序员如何做到快速升职?这几点你都做到了吗?
查看>>
第五届世界互联网大会重点介绍工业互联网
查看>>
凭什么程序员工资那么高?网友:某些文职坐着白领钱才让我惊奇
查看>>
程序员准时下班碰见领导,次月发工资时看到绩效莫名被扣20%
查看>>
你见过最牛逼的程序员是什么样的?拳打回车键,脚踩Emacs编辑器
查看>>
相比加班的程序员,企业更喜欢“偷懒”的程序员?程序员偷的不是懒,是高效!
查看>>
初学Java必备基础知识,编程领域你需要掌握的关键点!
查看>>
阿里五年Java程序员的总结,献给还在迷茫中的你!
查看>>
程序员身上有异味,同事为什么都不会直接告诉他?
查看>>
大数据折射算法“歧视”?王思聪微博抽奖113位,仅有一位男性
查看>>
Java、C、C+ +、PHP、Python分别用来开发什么?一篇文章告诉你!
查看>>
Linux-SHELL常用命令
查看>>
Linux-网络运维基础
查看>>
Linux网络运维-SSH
查看>>