1.shell和shell script
shell是解释器,shell script是脚本
2.本博客以bash(bourne again shell)为主要研究版本
3.查看当前shell解释器版本
echo $SHELL
ls -al 'which sh'
4.创建一个脚本
直接传入脚本
尝试调用脚本
发现问题
解决问题
在上面的示例中,我们知道有两种方式让脚本运行起来
1.直接使用 解释器+脚本名
这样相当于将脚本当作参数传入解释器,不需要操作当前脚本的用户必须拥有执行权限
2.使用./脚本名
这样的调用需要该用户有对该脚本的执行权限
脚本的第一句通常都是指定执行该脚本的解释器版本,默认是bash
#!/bin/bash
当用第一种方法去执行脚本时,由于在调用时就已经指定的解释器的版本,所以脚本内部的这句代码已经不重要了
当用第二种方法去执行脚本时,会首先查看是否指定解释该脚本的解释器版本
如果没有,则默认使用bash
所以需要对文件查看权限并在需要的时候赋权
补:用source filename
不需要执行权限
5.脚本注释
单行注释:#
多行注释:
:<<EOF
...
EOF
6.脚本基础
1.定义变量 :和大部分编程语言规则一样
但在命令/脚本中 不能随意写空格
2.引用变量 $变量名 {}可以分清变量界限
3.单、双引号;字符串可以用单、双引号,也可以不用单引号
单引号:不能识别变量,不能出现转义字符,会全部当作字符串
双引号:可以识别变量,可以出现转移字符
4.删除变量:unset unset不能删除制度变量 (readonly)
7.脚本常用命令
read命令从标准输入流中读取一行,并把输入的每个字段传给shell变量
read -p "提示内容"
编写脚本:
运行脚本:
printf命令:printf不会自动换行需要手动加\n;printf比echo移植性好
printf可以格式化字符串、限制字符串输出的格式、长度、对齐方式
格式控制有:
%d:decimal 必须是是十进制整数
%s:字符串
%f:浮点数
%c:字符型
如图所示:printf的使用格式:printf format-string [arguments]
printf "format \n" 参数 其中 format \n 就是格式
format表示:1.用什么类型的格式控制
--2.是否左对齐?默认右对齐(一般不考虑)
3.是否需要换行
当使用%f时.可以指定小数位数,可以看到默认的f是6位小数,通过.3f来设置只有3位小数
也可以使用%d、%s、%o、%x、%c
分不清8进制和16进制?没关系,变大的就是8进制 变小的就是16进制
其余格式控制符号自行尝试
这里要说明 格式重用:
8.shell变量
局部变量:局部变量在shell内部定义执行,只在当前脚本中生效,外部无法调用
环境变量:$path,环境变量可以保证一些程序的正确运行
shell变量:shell设置的特殊变量,可以保证shell的正常运行
查看环境变量:
变量涉及到许多:
以上内容中,变量与单双引号以及花括号&&字符串变量的截取 是本篇文章的重点,其余内容可自行查阅
变量的定义及其简单,直接a=1,就完成了定义和赋值
删除变量:unset a
单引号'$a'会将其引号的内容当作一个字符串而不是a的值
双引号则不会
花括号可以让变量分清界限:${a}
只读变量: readonly a
变量是可以被再赋值的,但只读变量不可以
获取变量长度: str="hello world" echo ${#str} 即可获取
字符串变量的截取:
假设现在有字符串 str="http://www.test.com/123"
${str:star:end}:从左边开始,从star位置开始截取,到end位置
${str:star}:从左边开始,从star位置开始截取,一直到字符串最后一位
${str:0-star:number}:从右边开始,从0到star的长度,往回截number个
${str:0-star}:从右边开始,从0到star的长度,一直到字符串最后一位
9.shell参数传递
shell参数传递也比较重要,我会在脚本中实例化,主要参数类型:
$0: 程序名称
$1-9: 程序的第1-9个变变量
$n:程序的第n个变量
$#:程序一共有几个变量
$*:程序的所有参数
$@:和$#类似,但在加引号时不同
$?:指上个程序的程序是否执行正确.默认是0.如果不是0则说明程序有bug或者warning,需要注意的是在linux中,有时候写错了不会报错,这样会误导.
创建脚本:test.sh
实例化:
接下来看$*和$@的区别:
10.类型转换
let
在使用let可以让表达式不再从左往右执行,相同的有:decalre -i 和$(())
11.日期类型
日期类型格式: date "+"
其中年时分秒分别都是大写标识:%Y %H %M %S
月日为小写标识:%m %d
建议书写格式:在连接时年月日用- 时分秒用:
12.条件表达式判断
test、[ ]、[ [ ] ]、(())
以上表达式判断的方法只需要会一种就可以
一般都是用[]
注意空格
13.关系运算符、布尔运算符、字符串运算符、文件测试运算符
关系运算符:eq、ne、gt、lt、ge、le
布尔运算符:-o 或 -a 与 !非
文件测试运算符:-z 判断字符串是否长度为0 若为0则返回T
-n判断字符串是否长度为0 若不为0则返回T
文件测试运算符:检测是不是块文件设备,是不是普通文件,是不是普通目录,...
这里记住-d file(是不是目录)和-f file和-e file(是不是普通文件)(文件是否存在)就行,其他的用的时候再查
一共13个