知识点七 shell脚本
什么是shell script 1、什么是shell shell是一个在操作系统之上的软件,linux登录后默认就进入这个软件 shell是一个命令的解释器,能解析用户所输入的命令 (ls cp rm pwd 等等) shell拥有自己内建的命令集 2、bash bash(Bourne Again shell )是shell的扩展,并且完全兼容shell(类似vim与vi的关系) 3、什么是shell script Shell脚本是利用 shell 的功能所写的一个程序,将一些shell的语法与命令(含外部命令)写在 里面, 搭配管道与数据重定向等功能,以达到我们所想要的功能。 4、解释型语言与编译型语言 shell脚本是解释型语言,执行时是逐条解释你写的程序来运行。(python) 而编译型语言需要先通过编译器进行编译,把代码翻译成机器能识别的指令,然后再运行(C++) 第一个shell script 第一步:使用文本编辑器(vim)来创建文本文件(一般以.sh结尾) 第一行必须包括shell声明:#! #!/bin/bash (告诉系统执行的时候要调用什么解释器) #开头的是shell的注释 第二步:输入命令 echo “hello world” 第三步:给文件添加执行权限 chmod 755 hello.sh 第四步 运行脚本 第一种方式:指定脚本的绝对或相对路径来运行 ./hello.sh 第二种方式:直接运行解释器,将脚本作为参数运行 sh hello.sh 常见问题 -bash: ./hello.sh: Permission denied 没有赋予执行权限 shell变量、赋值 一、变量 变量以字母或者下划线开头,后面接任意长度的字母、数字和下划线,如 var=linux 变量的引用需要在前面加$符号 ,如echo “$var” 如果变量的值中间有空格,需要用双引号引起来,如var=“hello world” 单引号、双引号的区别? 二、特殊变量 位置参数 $n ,n为数字,$0为命令本身,$1-$9是命令行第一道第9个参数 $* 代表所有参数 $# 代表参数的个数 $? 代表上一个命令的返回状态 三、命令替换和赋值 命令替换的格式: $(cmd) 或者 `cmd` # ``为tab上的反引号 在执行命令的时候,会先将$(cmd) 或者 `cmd` 里的命令先执行一遍,再将结果返回到原来的命令中 var=$(uname -a) echo $var 命令替换和管道的区别? 命令替换是将一个命令的输出作为另外一个命令的参数,而管道是将命令的输出作为下一个命令的标准输入 如 date +%Y|touch touch $(date +%Y) 四、算数运算和赋值 首先,echo 1+2,没有输出3。因为shell需要特殊的格式来进行算数运算 方式一 ((i=$j+$k)) 方式二 let i=$j+$k 赋值 var=$(($i+$j)) echo $var 五、多个命令分隔符 分号(;)是shell的命令分隔符, 让同一行的命令能够顺序执行。如echo 1 ;echo 2 shell中控制结构
上述脚本有什么问题?如果目录创建失败或目录创建成功但文件拷贝失败会如何? 会导致文件没有备份就被删除。因此需要在命令执行前做逻辑判断,根据上次命令的不同的执行状态, 来采取不同的操作。这里大概就会分为两类: 1、条件判断,基于各种条件,进行后续相应操作 2、循环控制
if语句和test命令 一、if 判断 在shell中if条件判断语句和我们的C、python等语言不同, shell的if语句条件必须用[ ]括起来,另外[ ]里外都需要用空格与周围隔开(例如[ a == b ]),否则会报错 if基本语法 if [ 表达式 ];then ;fi 或 if command;then ;fi 其中[ 表达式 ] 等同于test命令,man test 二、条件测试类型 整数测试 -eq 测试两个整数是否相等 -ne 测试两个整数是否不等 -gt 测试一个数是否大于另一个数 -lt 测试一个数是否小于另一个数 -ge 大于或等于 -le 小于或等于 字符串测试(两边要有空格) == 等于 != 不等 > 大于 < 小于 -z string 测试指定字符是否为空,空着真,非空为假 -n string 测试指定字符串是否为不空,空为假 非空为真 文件测试 -e FILE 测试文件是否存在 -f file 测试文件是否为普通文件 -d file 测试指定路径是否为目录 -r file 测试文件对当前用户是否可读 -w file 测试文件对当前用户是否可写 -x file 测试文件对当前用户是都可执行 组合测试 -a: and -o: or !: 非 shell中&&和||的使用方法 一、&&运算符: command1 && command2 &&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令 (命令2)才能够被执行;命令之间使用 && 连接,实现逻辑与的功能。 如test -f /var/log/messages && echo ok 二、||运算符: command1 || command2 ||则与&&相反。如果||左边的命令未执行成功,那么||右边的命令就会执行 如 test -f 123 || echo error for循环语法 一、for循环 for arg in [list] do command… done list列表可以是空格分割的字符串,也可以是命令替换返回的结果 如 for v in /etc/sudoers /etc/resolv.conf do ls -l $v done 1、请用for创建100个文件,文件名为ps1-ps100 2、请用for把ps1-ps100,分别创建100个tar包,命名为ps1.tar-ps100.tar while循环语法 二、while循环 while [condition] do command... done 输入名字 打印一个随机数字 while read -p "please input a name" name; do echo $name $RANDOM; done shell函数 格式 function name () { } shell函数可以带function关键字,也可以不带 shell函数内可以加return返回值,也可以不带,如果不带就以最后一条命令运行结果,作为返回值。 例如 demoFun(){ echo "这是我的第一个 shell 函数!" } echo "-----函数开始执行-----" demoFun echo "-----函数执行完毕-----"