【Linux】shell脚本语法和示例详解

shell脚本(.bash/.sh)

  1. 用cat /etc/shells可以显示系统安装的Shell.
  2. shell是一个可以一次性执行的可执行文件,即*.sh //相当于*.bat
  3. 脚本格式
    1)shell脚本必须为Unix文本文件
    2)shell脚本的第一句必须指定解释的shell或者空行
    • 通常固定格式为:#!/bin/sh
    • #号及其后面跟随的同一行的所有内容都被忽略
    3)shell脚本必须有可执行权限
    4)$,*,\’,\是脚本保留字符,要使用需用右斜杠
    5)#语句 //#号就是注释的意思
  4. 变量类型
    1)系统变量
    2)环境变量
    3)自定义变量
    eg:
        myfile="123"  #给myfile变量赋值
        echo ${myfile}  #输出myfile的值
    变量特点:
        1)所有变量不用定义可以直接使用
        2)所有变量值都是字符类型
  1. 注意’字符串’和 “字符串” 意义不同
    echo ‘字符串’ #’'里的字符串按原样输出
    echo “字符串” #""里的字符串若是变量即输出值,无则原样输出
  2. 自定义变量
        var=12
        echo ${var:-13} #-表示空值置换
        #输出:12
        #相当于:var==NULL ? 13 : var
        #如果var的值为空,则输出13其中var的值没变,否则为var的值
========其它表达式的含义======
        echo ${var:=value}  //空值置换,若为空则给var赋值并输出
        echo ${var:?}   //空值出错,若为空显示系统提示的错误信息
        echo ${var:?"err"}  //若为空,则显示自定义的提示的错误信息
        echo ${var:+value}  //有值置换,若有值则输出置换后的值
  1. 环境变量
    //shell 环境变量是所有shell 程序都会接收的参数。
    1)PATH 命令搜索路径,以冒号为分隔符.注意与DOS下不同的是,当前目录不在系统路径里
    2)HOME 用户home目录的路径名,是cd命令的默认参数
    3)IFS 定义SHELL使用的分隔符 ,指命令行参数分隔符IFS=$’ \t\n’
    4)LOGNAME 用户登录名
    5)SHELL SHELL的路径名
    6)TERM 终端类型 LD_LIBRARY_PATH 寻找库的路径,以冒号分隔
    用法:(直接在终端下操作)
    export LOGNAME //自定义一个环境变量
    echo LOGNAME //输出当前的用户登录名
    输出:root  //当前用户是是哪个用户就输出哪个用户名

其它用法:
1)export PATH=/home/atao:$PATH //将目录添加到了环境变量路径中
2)unset 变量名 //取消该定义的变量
【补充】
1)export //表示设置指定的环境变量
2)unset //用于取消环境变量和自定义的变量
8. 常用系统变量

    $n $1表示第一个参数    $2表示第二个参数    ...
    $# 显示命令行参数的个数
    $0 显示当前程序的名称
    $? 前一个命令或函数的返回值
    $* 以"参数1 参数2 ..."形式保存所有参数
    $@ 以"参数1" "参数2" ... 形式保存所有参数
    $$ 本程序的(进程ID号)PID
    $! 上一个命令的PID
    用法:echo "$$"
  1. 表达式的运算达
    格式:$((表达式))
    eg: echo $((1 + 3)) #输出:4
    *其中两种不同的将字符串当成数学表达式的关键字//let和expr
        1)let num=1+3
            echo $num   #输出:4
        2)num=`expr 1 + 3`
            echo $num   #输出:4
    #注意:`这个字符是Esc键下的那个字符,不是单引号.
  1. $(())支持多进制的表示
    八进制$((08))
    十六进制$((0x16))
  2. $((进制数#数字))任意进制的表示
    echo $((2#1101010)) #2进制表示
    echo $((8#377)) #8进制表示
    echo $((16#D8)) #16进制表示
    echo $((12#10)) #12进制表示
    echo $((36#ZZYY)) #36进制表示

=条件判断=

  1. 文件比较运算符
    -e filename //如果 filename存在,则为真
    -d filename //如果 filename为目录,则为真
    -f filename //如果 filename为常规文件,则为真
    -L filename //如果 filename为符号链接,则为真
    -r filename //如果 filename可读,则为真
    -w filename //如果 filename可写,则为真
    -x filename //如果 filename可执行,则为真
    filename1 -nt filename2 //如果 filename1比 filename2新,则为真 
    filename1 -ot filename2 //如果 filename1比 filename2旧,则为真
  1. 字符串比较运算符
    -z string //如果 string长度为零,则为真 
    -n string //如果 string长度非零,则为真
    string1 = string2 //如果 string1与 string2相同,则为真
    string1 != string2 //如果 string1与 string2不同,则为真
  1. 算术比较运算符
    num1 -eq num2 //等于         [ 3 -eq $mynum ]
    num1 -ne num2 //不等于       [ 3 -ne $mynum ]
    num1 -lt num2 //小于         [ 3 -lt $mynum ]
    num1 -le num2 //小于或等于   [ 3 -le $mynum ]
    num1 -gt num2 //大于         [ 3 -gt $mynum ]
    num1 -ge num2 //大于或等于   [ 3 -ge $mynum ]

=判断表达式是否为真的两种表示方法=

  1. test和[] //返回0成功,返回1失败
    方法一:test 表达式
    eg:test 1 -eq 0 #表达式为假
    方法二:[ 表达式 ]
    eg: [ 1 -eq 0 ] #表达式为假

=二种分支语句=

  1. if和case
    1. if/then/else/fi或者if/then/elif/fi
      用法:
   if [ -d /home/atao/demo1 ]
        then
            echo true
        else
            echo false
    fi
    #如果demo1目录存在就执行then后面的语句,否则执行else后的语句
等同于
       1) [ -d /home/atao/demo1 ] && echo true || echo false
       2) test -d /home/atao/demo1 && echo true || echo false 
  1. case 字符串 in; 模式1) 语句;;模式2) 语句;;esac
    其中:模式可以有多个值,用|分开 如1|2|3|4|5)
    用法:
   echo -n "please input option:"   #提示输入信息
   read input_s #从键盘输入
   case "$input_s" in   #判断入口
        1)echo "Linux";;
        2)echo "Windows";;
        3)echo "Ubuntu";;
        *)echo "input_s $input_s choice err"    #*)相当于default
        exit 1  #错误则返回1
    esac

=三种循环语句=

  1. for 判断表达式 ;do 语句;done
    #!/bin/sh
    1)for((x=1; x<5; x++))
        do
            echo "num $x=$x"
        done
    2)for x in 123 "abc" "666"
        do
            echo ${x}
        done
  1. while 判断表达式; do 语句;done
   #!/bin/sh
    x=1
    while((x<=10))
        do
            echo "Hello x is $x"
            let x=x+1   #相当于x++
        done
  1. until 判断表达式;do 语句;done
    翻译:until=直到…为止
    功能描述:重复循环直到条件为真为止
   i=0
    until [ $i -ge 20] #当i>=20的时候循环
        do
            i=$(($i+1))
            echo $i
        done
  1. shift命令
    功能描述:循环从命令行参数位置变量值取一个值出来,并且把总数减一
    • shift后可加整数进行一次多个移位
    eg:shift 3
    • 用法:
    until [ $# -eq 0 ]  #从终端获取参数,当参数总数等于0终止循环
        do
            echo "value=$1 count=$#"
            shift 3 #每次向后移动3个位置
        done
    #注意命令行参数总数,$#每shift一次,值减3

=三种跳出机制=

  1. break
    break [n]
    //中止循环过程的执行,并跳到下一个命令。N表示跳出嵌套的层数
  2. continue
    continue [n]
    //停止循环过程的当前一个反复并且跳到循环中的下一个反复过程的开始部分,n表示忽略的层数
  3. exit
    exit [n]
    //停止shell程序的执行,并且将返回值设置为n。

=shell函数=

  1. 不能单独写在一个脚本里,至少有一个调用语句
  2. 实例
    #!/bin/sh
    show()
    {
        echo "output show $*"   #输出参数表
    }
    echo "Hello kitty"
    #调用show()函数,记住在定义函数的脚本里,至少要调用一次
    show 123 "abc" "666"
    echo "============"
    echo $*
    echo $1

=交互式脚本(输入输出)=

  1. echo 输出语句
  2. read 变量名
    常用参数:read -p “提示信息” //每次输入时read提示
    用法 :
#!/bin/sh
read -p "Please input var = " var
echo "var = ${var}"
  1. 从管道里读取
    #!/bin/sh
    #read读取一个变量
    ls | while read file    #默认在本目录循环读取文件
        do
            ls $file    #显示读取到的文件
        done
    #!/bin/sh 
    #read可一次性读取多个变量
    #默认在本目录中分别读取文件名和文件对应的id号
    ls -i | while read file id 
        do
            #file存的是文件名,id存的是文件对应的节点号
            echo "File is $file ID is $id" 
        done
  1. select 表达式是bash的扩展应用,用户可以从一组不同的值中进行选择
    翻译:select 选择
    语法结构:
    #!/bin/sh
    select var in "Linux" "Windows" "Ubuntu"
        do
            break
        done
    echo "You have selected $var"
输出:
    1) Linux
    2) Windows
    3) Ubuntu
    #? 1
    You have selected Linux

=脚本调试=

//直接在终端下输入命令

  1. sh -x 命令
    •功能描述:执行该脚本并显示所有变量的值。
    1. sh -x name.sh #sh表示运行
    2. bash -x name.sh #与上述功能一样,表示运行
  2. sh -n 命令
    •功能描述:不执行,只执行语法检查
    sh -n name.sh #运行后不报错表示没错误
  3. trap 命令
    • 功能描述:令用于捕获指定的信号并执行预定义的命令。
    • 用法
    trap ‘command’ signal
    //其中signal是要捕获的信号,command是捕获到指定的信号之后,所要执行的命令。可以用kill–l命令看到系统中全部可用的信号名,捕获信号后所执行的命令可以是任何一条或多条合法的shell语句,也可以是一个函数名。
    • Shell伪信号
    1)EXIT 从一个函数中退出或整个脚本执行完毕
    2)ERR 当一条命令返回非零状态时(代表命令执行不成功)
    3)DEBUG 脚本中每一条命令执行之前
    • (DEBUG)对相关变量的全程跟踪
trap 'echo “before execute line:$LINENO, a=$a,b=$b,c=$c”' DEBUG
• (EXIT)判断脚本的执行状态以及出错原因
trap 'command' EXIT 或 trap 'command' 0
• (ERR)追踪执行不成功的命令或函数,并输出相关的调试信息
trap 'ERRTRAP $LINENO' ERR 

=系统的几个脚本=

  1. init脚本的存储目录
    • /etc/rc ,/etc/rc.d/init.d 或者 /etc/init.d 目录下
    2./sbin/service 用于控制各种服务的启动和停止
    用法:
    >: /sbin/service smb restart    #重启smb服务器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值