shell脚本

157 阅读5分钟

​开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第17天,点击查看活动详情

目录

一、什么是shell

二、运行方法

三、shell格式

四、变量定义和引用

五、shell中无引号、单引号和双引号的区别

六、反引号

七、if语句

八、for循环

九、while循环

十、case语句

十一、echo的创建和追加输入文件

十二、shell程序的传参

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

一、什么是shell

  • shell脚本其实是一类语言而不是一个语言。
  • 常用shell语言:sh、bash、csh、ksh、perl、python等
  • 脚本语言一般在嵌入式中应用,主要是用来做配置
  • shell脚本的运行机制:解释运行
    shell解析器会逐行的解释shell程序代码,然后一行一行的去运行。(顺序结构)

二、运行方法

  • ./xx.sh,chmod a+x xx.sh来添加可执行权限。
  • source xx.sh,source是linux的一个命令,这个命令就是用来执行脚本程序的。这样运行不需要脚本具有可执行权限。
  • bash xx.sh,bash是一个脚本程序解释器,本质上是一个可执行程序。这样执行相当于我们执行了bash程序,然后把xx.sh作为argv[1]传给他运行。

三、shell格式

  • shell程序的第一行一般都是: #!/bin/sh
    指定shell程序执行时被哪个解释器解释执行

  • 利用shell输出变量
    1.编写.sh文件
    2.加运行权限chmod +x xx.sh
    3.运行./xx.sh

    #!/bin/sh mkdir xiaowei cd xiaowei touch demo1.sh

四、变量定义和引用

  • shell是弱类型语言(语言中的变量如果有明确的类型则属于强类型语言;变量没有明确类型就是弱类型语言)

  • shell中赋值的=两边是不能有空格的

  • 引用一个变量必须使用符号,符号,符号就是变量解引用符号

  • 变量引用的时候可以var也可以var,**也可以{var}**。这两种的区别是在某些情况下只能用var而不能简单的{var}而不能简单的var

    #!/bin/sh a=xiaowei echo a echo aechoa echo ayou echo ${a}you

    xw@ubuntu:~/xiaowei$ ./demo1.sh a xiaowei

    xiaoweiyou

五、shell中无引号、单引号和双引号的区别

  • shell中使用字符串可以不加双引号,直接使用。而且有空格时也可以,但是缺陷是不能输出"或者其他转义字符

  • shell中也可以使用单引号来表示字符串,也是直接使用的,不能输出转义字符。

  • 无引号:不能出现任何转义字符
    单引号:完全输出
    双引号:按照转义字符输出

  • \表示表示的字面值,输出$符号
    \`表示`的字面值
    \"表示"的字面值
    \\表示\的字面值

    #!/bin/sh echo new string echo 'new st"ring' echo "new st"ring" var="$a$" echo varvar="var var="a"echo" echo var #如果不加转义字符,没办法输出aa

    xw@ubuntu:~/xiaowei./16.shnewstringnewstr¨ingnewst"ring./1_6.sh new string new st\"ring new st"ringa

六、反引号

得到这个命令的返回值

#!/bin/sh
MYPATH="`pwd`/include"
echo "MYPATH = $MYPATH"


xw@ubuntu:~/xiaowei$ ./1_5.sh 
MYPATH = /home/xw/xiaowei/include

七、if语句

  • 典型if格式
    if [表达式]; then
    xxx
    else
    xxx
    fi

  • 典型应用
    判断文件是否存在(-f),注意[]里面前后都有空格,不能省略
    判断目录是否存在(-d)
    判断字符串是否相等("str1" = "str2")
    判断数字是否相等(-eq)、大于(-gt)、小于(-lt)、大于等于(-ge)、小于等于(-le)
    (eq就是equal,gt就是greater than,lt就是less than,ge就是greater or equal,le就是less or equal)
    判断字符串是否为空(-z)

  • “-o”表示逻辑或

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

    #!/bin/sh #数字判断 if [ 21 -eq 21 ]; then echo "yes" else echo "no" fi

    #逻辑或 if [ "st" = "str" -o 21 -gt 10 ]; then echo "yes" else echo "no" fi

    #|| &&, str="ss" [ -z str ] || echo "fei kong" #str为非空,左边不成立,为0,判断右边,输出 str="" [ -z str ] && echo "kong" #str为空,左边成立,为1,判断右边,输出

    xw@ubuntu:~/xiaowei$ ./1_7.sh yes yes fei kong kong

八、for循环

#!/bin/sh
#for i in 1 2 3 4 5 6
for i in `ls`
do
        echo $i
done


xw@ubuntu:~/xiaowei$ ./8.sh 
1_5.sh
1_6.sh
1_7.sh
8.sh
demo1.sh

九、while循环

#!/bin/sh
i=2
j=11
while [ $i -lt $j ]  #-lt小于
do
        echo $i
        i=$(($i + 2)) #i++
done

xw@ubuntu:~/xiaowei$ ./9.sh 
2
4
6
8
10

十、case语句

  • shell中的case语句和C语言中的switch case语句作用一样

  • shell中的case语句,不需要break

    #!/bin/sh i=2 case $i in

    1. echo "1" ;;
    2. echo "2" ;; esac

    xw@ubuntu:~/xiaowei$ ./10.sh 2

十一、echo的创建和追加输入文件

  • shell中可以直接使用echo指令新建一个文件,并且将一些内容传入这个文件中>

  • 追加符号>> 向一个已经存在的文件末尾追加输入内容

    #!/bin/sh echo ls > a.txt #运行ls echo ./9.sh >> a.txt #运行9.sh

    #a.txt文件内容 10.sh 11.sh 1_5.sh 1_6.sh 1_7.sh 8.sh 9.sh demo1.sh 2 4 6 8 10

十二、shell程序的传参

  • C语言中可以通过main函数的argc和argv给程序传参

  • shell中
    #表示调用该shell时传参的个数。(#计数时只考虑真正的参数个数)
    00、1、$2·····则依次表示传参的各个参数。

    echo # 0 11 2 $3

    xw@ubuntu:~/xiaowei$ ./12.sh 1 2 3 3 ./12.sh 1 2 3

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

  • shell中的# 1等变量的值是可以被改变,被shift指令改变。shift指令有点像左移运算符,把我们给shell程序的传参左移了一个移出去了,原来的2变成了新的2变成了新的1,原来的$#少了1个。

  • break跳出while循环

    #!/bin/sh while [ # -gt 0 ] ; do #大于 case # in 1) echo # 1 ; shift ; break ;; #break跳出while 2) echo # 1 2 ; shift ;; #shift指令,左移 3) echo # 11 2 3;shift;;esacdoneecho3 ; shift ;; esac done echo # 00 1 22 3

    xw@ubuntu:~/xiaowei$ ./13.sh 7 8 9 3 7 8 9 2 8 9 1 9 0 ./13.sh