• shell语法使用


      这两天初次接触shell编程,所谓shell编程其实就是用一定的语法将各种基本的命令组合起来,让shell程序去解释执行。如果对windows的dos有了解,可以这样理解,其实shell脚本文件和.bat批处理文件差不多,不过linux下的shell比起windows的dos强大很多。

      shell有很多种,如bash、sh 、tcsh、 ksh等,linux系统里面默认使用的是bash。

      下面看一下学习shell的第一个程序:

      输入命令vi my_01.sh,创建一个my_01.sh文件并用vi编辑器打开。编辑内容如下:

    1 #!/bin/bash
    2 echo "aaaa"
    3 echo "第一次接触shell"

      这里第一行是指让bash这个shell去执行这个shell程序。echo是用来输出的,第二行和第三行分别输出两句话。

    执行这个shell程序可以用如下几种方法:

      1  ./my_01.sh

      2  . my_01.sh

      3  bash my_01.sh

    注:新创建的文件默认是没有执行权限的,所以必须给该文件授予执行权限后才能执行。授权命令:chmod u+x my_01.sh或者chmod 755 my_01.sh

      下面是第二个shell程序:

    1 #!/bin/bash
    2 #my_02.sh
    3 read -p "please input your name:" name
    4 echo "$name,welcome!"

      这里第三行read命令是指等待用户输入,-p后面是指提示,它还有一个参数-t是设置等待时间的。这个程序运行结果如下:

    [liuling@bogon test]$ ./my_02.sh
    please input your name:liuling
    liuling,welcome!

      注:第四行echo使用的是双引号,如果使用单引号的话,则这句就会直接输出 $name,welcome! 。双引号是可以解析里面的变量的,而单引号则不行。

    下面看看shell脚本的语法:

    一、条件判断if else的使用

    if分支语句的写法:

    if 条件测试
        then 满足条件执行什么
        else 不满足条件执行什么
    fi

    多分支写法:

    if 条件1
        then 
        执行命令2
    elif 条件1
        then 
        执行命令2
    else
        执行命令3
    fi

       注:if和fi要配对,以fi结束这个条件判断。在不满足第一个条件下再判断使用的是elif,而不是else if。then必须独占一行。

     下面看几个例子:

     1 #!/bin/bash
     2 #my_03.sh
     3 
     4 read -p "pelease input your name:" name
     5 read -p "pleaase input your password:" passwd
     6 #if test $name = "liuling" 
     7 if [ $name = "liuling" -a $passwd = "lz19921009" ]
     8 then
     9     echo "登录成功!"
    10 else
    11     echo "登录失败!"
    12 fi
     1 #!/bin/bash
     2 #my_04.sh
     3 
     4 read -p "please input your score:" score
     5 
     6 if [ $score -gt 90 ]
     7 then
     8     echo "优秀!"
     9 elif [ $score -gt 80 -a $score -le 90 ]
    10 then
    11     echo "良好!"
    12 else
    13     echo "一般!"
    14 fi
     1 #!/bin/bash
     2 #my_05.sh
     3 
     4 read -p "please input your score:" score
     5 #如果使用(())的话,只能用< > >= <=
     6 if (( $score > 90 ))
     7 then
     8     echo "优秀!"
     9 elif [[ $score -gt 80 && $score -le 90 ]]
    10 then
    11     echo "良好!"
    12 else
    13     echo "一般!"
    14 fi

      测试用户输入的文件名是目录还是文件:

     1 #!/bin/bash
     2 #my_06.sh
     3 
     4 read -p "请输入一个目录或者文件名:" name
     5 if [ -z $name ]
     6 then
     7     echo "你输入的信息为空!"
     8 else
     9     if [ -f $name ]
    10     then
    11         echo "这是一个文件!"
    12     elif [ -d $name ]
    13     then
    14         echo "这是一个目录!"
    15     else
    16         echo "不存在这样一个目录或者文件!"
    17     fi
    18 fi

      这三个例子都是关于if条件判断的用法。条件有这么几种写法:[ 条件 ]、test 条件、[[ 条件 ]]、(( 条件 )),用的最多的是第一种。常用判断符号如下

    ①、逻辑运算符

      -a  expr1 -a expr2  逻辑与

      -o  expr1 -o expr2  逻辑或

      !  !expr1      逻辑非

    ②、数值判断

      -eq  num1 -eq num2  是否相等

      -ne  num1 -ne num2  是否不相等

      -gt  num1 -gt num2  是否大于

      -ge  num1 -ge num2  是否大于等于

      -lt  num1 -lt num2  是否小于

      -le  num1 -le num2  是否小于等于

    ③、字符串判断

      =  str1 = str2  字符串是否相等

      !=  str1 != str2  字符串是否不等

      -n  -n str1    字符串长度是否不等于0

      -z  -z str2    字符串长度是否等于0

    ④、文件判断

      -r  -r filename  文件是否存在且可读

      -w  -w filename  文件是否存在且可写

      -s  -s filename  文件是否存在且长度非0

      -f  -f filename  文件是否存在且是普通文件

      -d  -d filename  文件是否存在且是一个目录

      在使用条件判断的时候一定要注意空格,如if [ $name = "liuling" -a $passwd = "lz19921009" ],[]里面前后要有一个空格,所有的判断符号以及逻辑运算符号前后都要有空格,否则会报错。使用[[ 条件 ]]的时候只能使用"&&"符号作为逻辑与来代替"-a",如果使用(( 条件 ))的话,只能用< > >= <=符号,而不能使用“-eq”等符号。

    二、case的用法

      这里的case优点类似于java中的swith case

    case语法如下:

    case var in
    pattern 1)
        执行语句1
        ;;
    pattern 2)
        执行语句2
        ;;
    pattern 3)
        执行语句3
        ;;
    *)
        执行语句4
        ;;
    esac

    注意:*)指匹配其他任意字符串
             每种情况都以;;结束

    下面是几个case用法的例子

      1.模拟菜单的选择

     1 #!/bin/bash
     2 #my_07.sh
     3 
     4 echo "1 - 普通显示"
     5 echo "2 - 详细显示"
     6 echo "3 - 显示隐藏文件"
     7 echo "4 - 推出"
     8 
     9 read -p "请选择操作号:" num
    10 case $num in
    11     1) 
    12         ls ;;
    13     2)
    14         ls -l ;;
    15     3)
    16         ls -al ;;
    17     4)
    18         exit ;;
    19     *)
    20         echo "请输入正确的操作(1--4)" 
    21         exit ;;
    22 esac

    三、循环语句的使用

    1、for循环

    for 变量名 in 取值列表
    do
        命令序列
    done


    下面是for循环使用的小例子:

     1 #!/bin/bash
     2 #my_08.sh
     3 
     4 for a in `seq 1 3 10`
     5 do
     6     echo $a
     7 done
     8 echo "-------------------"
     9 for ((i=1;i<=10;i++))
    10 do
    11     echo $i
    12 done

      这里第四行使用了`seq 1 3 10`,``是反引号,也就是键盘上Esc下面的一个键,``里面可以写执行命令,把执行后的结果返回。

      seq命令是指序列,seq start size max,start是起始,size是步长,max就是限制的数,比如seq 1 3 10,则返回的是1 4 7 10。

      第9行代码也有点特别,有点像java里面的for循环,不过是双重小括号,在shell中这样也是可以的。

      下面是一个统计文件数目的小程序:

     1 #!/bin/bash
     2 #my_09.sh
     3 
     4 i=0
     5 for name1 in `ls /etc`
     6 do
     7    # i=`expr $i + 1`
     8    # let i++
     9    # i=$[$i + 1]
    10    # i=$(($i + 1))
    11    ((i++))
    12 
    13 done
    14 echo "文件总数为:$i"

      注:7、8、9、10、11行是数字自增的不同写法,都可以。

    2、while循环

    while 条件
    do
        命令序列
    done

    下面是一个录入客户资料的shell脚本:

     1 #!/bin/bash
     2 #my_10.sh
     3 
     4 while true
     5 do
     6         echo "登记客户资料(c继续,q退出):"
     7         read choice
     8 
     9         case $choice in
    10                 c)
    11                         echo "请输入客户名字:"
    12                         read name1
    13                         echo "请输入客户年龄:"
    14                         read age1
    15                         echo "姓名:"${name1}" - 年龄:"${age1} >>customer.txt
    16                         ;;
    17                 q)
    18                         exit
    19                         ;;
    20         esac
    21 done

    注:
    >>是指重定向,将标准输出重定向到其他的输出流中,如上面15行是指将标准输出重定向到customer.txt文件。所以echo输出的内容会输出到customer.txt文件中去。

    >> 和 > 区别

    >>customer.txt 追加保存到customer.txt文件中, 如果文件不存在会自动创建。

    >customer.txt 就会重新写入, 覆盖原有的数据

    四、函数的应用

    function 函数名(){
    
    }
    or
    函数名(){
    
    }
    
    函数调用:
    函数名
    函数名 参数1 参数2

    下面是一个小例子程序:

    1 #!/bin/bash
    2 #fun.sh
    3 function add(){
    4     echo $(($1+$2))
    5 }
    6 add 20 30
    7 add 20 90

      

  • 相关阅读:
    Azure DevOps Server 2020.1 新增功能 (TFS)
    Azure DevOps Server 2020.1 升级指南 (TFS)
    Azure DevOps Server:如何在Git历史记录中显示中文姓名
    Azure DevOps Server:集中显示所有团队的燃尽图
    MS中adjust hydrogen功能不能使用的问题
    bat对拍
    CSP 201812-4 数据中心(最小瓶颈生成树)
    CSP 202009
    CSP 202012
    牛客练习赛76
  • 原文地址:https://www.cnblogs.com/liuling/p/2013-8-4-01.html
Copyright © 2020-2023  润新知