zoukankan      html  css  js  c++  java
  • linux下bash脚本语法

    1、shell中的变量定义和引用
    (1)变量定义和初始化。shell是弱类型语言(语言中的变量如果有明确的类型则属于强类型语言;变量没有明确类型就是弱类型语言),和C语言不同。在shell编程中定义变量不需要制定类型,也没有类型这个概念。
    (2)变量定义时可以初始化,使用=进行初始化赋值。在shell中赋值的=两边是不能有空格的。
    注意:shell对语法非常在意,非常严格。很多地方空格都是必须没有或者必须有,而且不能随意有没有空格。
    (3)变量赋值,变量定义后可以再次赋值,新的赋值会覆盖老的赋值。shell中并不刻意区分变量的定义和赋值,反正每个变量就是一个符号,这个符号的值就是最后一个给他赋值时的值。
    (4)变量引用。shell中引用一个变量必须使用$符号,$符号就是变量解引用符号。
    注意:$符号后面跟一个字符串,这个字符串就会被当作变量去解析。如果这个字符串本身没有定义,执行时并不会报错,而是把这个变量解析为空。也就是说在shell中没有被定义的变量其实就相当于是一个定义并赋值为空的变量。
    注意:变量引用的时候可以$var,也可以${var}。这两种的区别是在某些情况下只能用${var}而不能简单的$var

    2、shell中无引用、单引号和双引号的区别
    (1)shell中使用字符串可以不加双引号,直接使用。而且有空格时也可以,但是缺陷是不能输出"或者其他转义字符。
    (2)shell中也可以使用单引号来表示字符串,也是直接使用的,不能输出转义字符。

    (3)单引号中:完全字面替换(不可包含单引号本身)
    (4)双引号中:
    $加变量名可以取变量的值
    反引号仍表示命令替换
    $表示$的字面值 输出$符号
    \`表示`的字面值
    "表示"的字面值
    \表示的字面值
    除以上情况之外,在其它字符前面的无特殊含义,只表示字面值。

    #!/bin/sh
    #var
    
    string="hello world"
    echo $string
    echo "a"bc"
    echo 'a"bc'
    echo $c

    3、shell中调用linux命令
    (1)直接执行
    (2)反引号括起来执行。有时候我们在shell中调用linux命令是为了得到这个命令的返回值(结果值),这时候就适合用一对反引号(键盘上ESC按键下面的那个按键,和~在一个按键上)来调用执行命令。

    PWD=`pwd`
    echo $PWD
    
    MYPATH="`pwd`include"
    MYPATH1='`pwd`include'
    echo "MYPATH=$MYPATH"
    echo "MYPATH1=$MYPATH1"

    4、shell中的选择分支结构
    (1)shell的if语言用法很多,在此只介绍常用的,其他感兴趣可以自己去学
    (2)典型if语言格式
    if [表达式]; then
    xxx
    else
    xxx
    fi
    (3)if的典型应用
    判断文件是否存在。(-f),注意[]里面前后都有空格,不能省略。
    判断目录是否存在 (-d)
    判断字符串是否相等("str1" = "str2"),注意用一个等号而不是两个
    判断数字是否相等(-eq)、大于(-gt)、小于(-lt)、大于等于(-ge)、小于等于(-le) 回忆一下在ARM裸机中讲述ARM汇编条件执行时,曾经用过这些条件判断的缩写。(eq就是equal,gt就是greater than,lt就是less than,ge就是greater or equal,le就是less or equal)
    判断字符串是否为空(-z)注意-z判断时如果变量本身没定义也是不成立(也就是说-z认为没定义不等于为空)

    (4)if判断式中使用“-o”表示逻辑或
    相当于C语言中在if后面的条件式中用逻辑与、逻辑或来连接2个式子,最终的if中是否成立取决于2个式子的逻辑运算结果。

    (5)逻辑与&&和逻辑或||与简写的if表达式相结合

    #!/bin/sh
    # comment
    
    
    #简写if
    [ "awbc" = "abc" ] || echo "ok1"
    [ "abc" = "abc" ] && echo "ok2"
    
    
    #-z判断字符串是否空
    
    str=""
    if [ -z $str ]; then
        echo "yes"
    else
        echo "no"
    fi
    # -eq -gt -lt -ge -le
    if [ 21 -gt 2  ]; then
        echo "yes"
    else
        echo "no"
    fi
    
    #判断字符串
    str="aaboot"
    if [ $str = "aboot"  ]; then
        echo "yes"
    else
        echo "no"
    fi
    
    #-o 表示逻辑或
    if [ 1234 -eq 123 -o "abc4" = "abc" ]; then
        echo "yes"
    else
        echo "no"
    fi
    
    #判断文件是否存在
    #if [ -f ./dir/a.txt ]; then
    #    echo "yes"
    #else
        #test2  当前目录下 在创建dir并创建a.txt
    #    mkdir dir
    #    cd dir
    #    touch a.txt
    #    cd ..
    #fi

    5、for循环
    (1)要求:能看懂、能改即可。不要求能够完全不参考写出来。因为毕竟嵌入式并不需要完全重新手写shell,系统管理员(服务器运维人员,应用层系统级管理开发的才需要完全掌握shell)

    6、while循环
    (1)和C语言的循环在逻辑上无差别
    (2)要注意很多格式要求,譬如:while后面的[]两边都有空格,[]后面有分号分号(如果do放在一行的话),i++的写法中有两层括号。

    #!/bin/sh
    #  循环
    #while
    i=1
    j=11
    #echo $(($i + $j)) 
    while [ $i -le $j ]; do
        echo $i
        i=$(($i+1))
    done
    
    #for
    
    #for i in 1 2 3 4 5
    #for i in `ls`
    #do
    #    echo $i
    #done

    7、echo的创建和追加输入文件
    (1)在shell中可以直接使用echo指令新建一个文件,并且将一些内容传入这个文件中。创建文件并输入内容的关键就是>。
    (2)还可以使用echo指令配合追加符号>> 向一个已经存在的文件末尾追加输入内容。

    #!/bin/sh
    
    #echo 创建文件并追加文件
    
    echo "#include<stdio>
    int main()
    {
    int b;
    return 0;
    }">a.c
    #追加
    echo "追加内容">>a.c

    8、case语句

    (1)shell中的case语句和C语言中的switch case语句作用一样,格式有差异
    (2)shell中的case语句天生没有break,也不需要break,和C语言中的switch case不同。shell中的case默认就是匹配上哪个执行哪个,不会说执行完了还去执行后面的其他case(就好像shell中的case语言默认都带了break)。

    9、调用shell程序的传参
    (1)C语言中可以通过main函数的argc和argv给程序传参(详情参考《4.8.3.argc、argv与main函数的传参》)
    (2)shell程序本身也可以在调用时传参给他。在shell程序内部使用传参也是使用的一些特定符号来表示的,包括:
    $#表示调用该shell时传参的个数。($#计数时只考虑真正的参数个数)
    $0、$1、$2·····则依次表示传参的各个参数。

    C语言:./a.out aa bb cc argc = 4, argv[0] = ./a.out, argv[1]是第一个有效参数····

    shell:source a.sh aa bb cc $# = 3, $0是执行这个shell程序的解析程序的名字,$1是第一个有效参数的值,$2是第2个有效参数的值·····

    注意:shell中的很多语法特性和C语言中是相同的,也有很多是不同的。所以大家学的越多越容易混淆(本质原因还是用的不熟悉,用的少),解决方案是:做笔记、作总结、多写代码经常用

    #!/bin/sh
    
    
    #shell 传参  ./case.sh aa bb cc   输出 3 aa bb cc
    echo $# $0 $1 $2 $3
    
    
    #case
    
    #var=2
    #case $var in
    #1) echo "1" ;;
    #2) echo "2" ;;
    #esac

    10、while循环和case语言和传参结合

    (1)shell中的break关键字和C语言中意义相同(都是跳出)但是用法不同。因为shell中case语句默认不用break的,因此在shell中break只用于循环跳出。所以当while中内嵌case语句时,case中的break是跳出外层的while循环的,不是用来跳出case语句的。
    (2)shell中的$# $1等内置变量的值不是不可变的,而是可以被改变,被shift指令改变。shift指令有点像左移运算符,把我们给shell程序的传参左移了一个移出去了,原来的$2变成了新的$1,原来的$#少了1个。

  • 相关阅读:
    [转载]windows进程中的内存结构
    RTTI和4个强制转换运算符
    由于应用程序配置不正确,程序未能启动
    光照
    服务器数据同步
    SAP
    PHP输入流php://input
    五款常用mysql slow log分析工具的比较
    开发搜索引擎–PHP中文分词
    大型网站调试工具之一(php性能优化分析工具XDebug)
  • 原文地址:https://www.cnblogs.com/PengfeiSong/p/6388529.html
Copyright © 2011-2022 走看看