美文网首页
Shell从入门到放弃

Shell从入门到放弃

作者: 小米Metre | 来源:发表于2018-08-02 16:10 被阅读0次

    1、什么是Shell?

    shell 由C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一个程序设计语言。
    Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核服务。

    Shell 脚本
    Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
    一般我们说的Shell是指shell脚本。

    Unix系统中常见的shell有:sh、csh、ksh、tcsh、bash。

    2、基本常识

    shell脚本必须以 #!/bin/bash 开头。
    以#开通的行表示注释,会被解释器忽略。
    例如:test.sh

    #!/bin/bash
    for i in 1 2 3 4 5 
    do 
     echo "The value is :$i"
    done
    

    执行:

    chmod +x test.sh #使该脚本具有执行权限
    ./test.sh      #执行脚本
    /bin/sh test.sh  # 或者,作为解释器参数执行
    

    3、常见语法

    变量的定义与赋值
    规范
    • 首字母必须为字母
    • 中间不能有空格
    • 不能使用标点符号
    • 不能使用bash里的关键字
    赋值

    变量没有默认值,所有必须在定义是赋初始值。

    #!/bin/bash
    MYNAME=Metre
    echo ${MYNAME}
    

    注意:等号前后不能有空格。

    向Shell传参数

    $数字: 表示第几个参数(0,表示执行的文件名)。

    为脚本设置可执行权限,并执行脚本,输出结果如下所示:

    $ chmod +x test.sh 
    $ ./test.sh 1 2 3
    Shell 传递参数实例!
    执行的文件名:./test.sh
    第一个参数为:1
    第二个参数为:2
    第三个参数为:3
    

    另外,还有几个特殊字符用来处理参数:

    参数处理 说明
    $# 传到脚本的参数个数
    $* 以字符串的方式传递所有参数到脚本
    $$ 脚本运行的当前进程ID
    $! 后台运行的最后一个进程ID
    $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
    $- 显示Shell使用的当前选项,与set命令功能相同。
    $? 显示最后命令的推出状态。0表示没有错误,其他任何值表明有错误。
    运算符

    运算符之间一定要有空格,例如 1+1 是错的。必须写成 1 + 1

    关系运算符
    运算符 说明
    -eq 检测两个数是否相等,相等返回true 例如: if [ $a -eq xx ]
    -ne 检测两个数是否相等,不相等返回true
    -gt 检测左边的数是否大于右边的数,如果是,返回true
    -lt 检测左边的数是否小于右边的数,如果是,返回true
    -ge 检测左边的数是否大于等于右边的数,如果是,返回true
    -le 检测左边的数是否小于等于右边的数,如果是,返回true
    布尔运算符
    运算符 说明
    && 逻辑与
    两竖 逻辑或
    字符串运算符
    运算符 说明
    = 检测两个字符串是否相等,相等返回true
    != 检测两个字符串是否相等,不相等返回true
    -z 检测字符串长度是否为0,为0返回true
    -n 检测字符串长度是否为0,不为0返回true
    str 检测字符串是否为空,不为空返回true 。例如 :n=“abc” if[$a] 返回true
    流程控制

    if语句 和 for循环 和 while 循环。

    #!/bin/bash
    a=2 #变量
    b=2  #变量
    #if语句
    if [ $a == $b ]  #注意空格   if 和 [ 和 $a 和 == 之间都必须有空格。
    then   
        echo "a 等于 b"
    elif [ $a -lt $b ]
    then
        echo "a 小于 b"
    else
        echo "a 大于 b"
    fi #fi结束
    
    for i in 1 6 7 8 # for循环
    do
        echo "for1 The value is:${i}"
        #加入判断
        if [ ${i} == 7 ]
        then
            echo 'break'
            break #跳出循环
        fi
    
      #加入判断
      if [ ${i} -ge 6 ]
      then
          echo 'continue'  
          continue #跳过本次循环执行下一次。
        fi
    done
    
    #循环的另外一种写法
    for (( i=1;i<=2;i++ ))
    do
        echo "for2 ${i}"
    done
    
    #while循环。
    index=0
    while(($index <=3))
    do
        echo "while ${index}"
    let "index++"
    done
    

    执行结果:

    a 等于 b
    for1 The value is:1
    for1 The value is:6
    continue
    for1 The value is:7
    break
    for2 1
    for2 2
    while 0
    while 1
    while 2
    while 3
    

    无限循环:

    while true
    do
    #执行业务
    done
    
    while  :
    do
    #执行业务
    done
    
    变量引用

    引用shell变量要用$符号,并加{},以防止歧义。
    例如:


    引用案例
    声明变量

    声明变量时,不能有空格,必须要有默认值。


    案例
    单引号和双引号

    二者都可以标识字符串,不同的是,单引号只能表示字符串,而双引号可以引用变量或特殊函数。


    例子
    命令代换

    反引号`` 或者 $(),其中的内容,会以命令的方式执行。

    [root@jcsrv-110 home]# echo `sldf`
    bash: sldf: command not found
    
    例子
    算数代换:$(())
    [root@jcsrv-110 home]# SB=$((2+1))
    [root@jcsrv-110 home]# echo ${SB}
    3
    [root@jcsrv-110 home]# 
    
    数组
    ar=(a 1 3 b 4 s) #定义数组
    i=1 #变量
    ar[${i}]=abc # 重新赋值
    echo "数下标${i}的值为:${ar[i]}" # 输出
    
    文件测试运算符
    file="/home/test.sh"
    if [ -r $file ]
    then
       echo "文件可读"
    else
       echo "文件不可读"
    fi
    

    文件测试运算符用于检测 Unix 文件的各种属性。属性检测描述如下 :

    操作符 说明 举例
    -b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
    -c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
    -d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
    -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
    -g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
    -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
    -p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
    -u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
    -r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
    -w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
    -x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
    -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
    -e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
    函数定义:
    [root@jcsrv-110 home]# vi funtest.sh 
    #!/bin/bash
    
    funAddNum(){  #定义函数
        echo "该函数对输入的两个数字进行相加运算...."
        printf "请输入第一个数字:"
        read anum  #控制台输入
        echo "请输入第二个数字:"
        read bnum  #控制台输入
        echo "两个数字分别为 ${anum} 和 ${bnum}"
        return $(($anum + $bnum))
    }
    
    funAddNum # 调用函数
    echo "输入的两个数字之和为: $? " # $?获取函数返回。
    

    输入结果:

    [root@jcsrv-110 home]# ./funtest.sh 
    该函数对输入的两个数字进行相加运算....
    请输入第一个数字:1
    请输入第二个数字:
    3
    两个数字分别为 1 和 3
    输入的两个数字之和为: 4 
    
    带参函数:
    [root@jcsrv-110 home]# vi funParam.sh 
    #!/bin/bash
    
    funByParam(){
        echo "第一个参数: $1"
        echo "第二个参数: $2"
        echo "第五个参数: ${5}"
        echo "参数总数为: $# 个"
        echo "输入所有参数: $* "
    }
    funByParam 1 4 3 4 25 656 44  #传参调用.
    

    输出结果:

    [root@jcsrv-110 home]# ./funParam.sh 
    第一个参数: 1
    第二个参数: 4
    第五个参数: 25
    参数总数为: 7 个
    输入所有参数: 1 4 3 4 25 656 44
    

    相关文章

      网友评论

          本文标题:Shell从入门到放弃

          本文链接:https://www.haomeiwen.com/subject/ejrjvftx.html