shell介绍
linux shell是一种命令行解释器,它允许用户通过命令行界面与操作系统进行交互
shell提供了基本的命令执行,变量,条件判断,循环,函数,处理逻辑操作等语法,使得用户可以通过编写脚本自动化执行一系列命令.
执行.sh文件的常用方法
1)bash a.sh
2)sh a.sh
3)source a.sh
4)bash < a.sh 或者 sh < a.sh
5)赋予可执行权限 直接运行 chmod +x a.sh
shell脚本变量的分类
1)环境变量
环境变量是在shell启动时由操作系统设置的,他们对于所有的shell和shell执行的程序都是可见的
$HOME,$PWD,$SHELL,$USER
2)特殊变量(系统预定义变量)
特殊变量是由shell程序预定义的,用于存储一些特定的值或状态
例如:$?用于存储上一个命令的返回值,$$用于存储当前shell进程的pid,$IFS用于存储当前shell的字段分隔符等。
$?:记录最后一条命令的执行状态。0 表示命令执行成功而且有结果
$#:传递参数的个数
$*和$@:取出所有的传递参数
$$:当前进程的进程PID
$$:当前脚本或进程的进程ID。
$?:上一个命令或脚本的退出状态码。 0 表示命令执行成功而且有结果
$!:上一个后台进程的进程ID。
$USER:当前用户的用户名。
$HOME:当前用户的主目录路径。
$PATH:当前系统的执行路径。
$PWD:当前工作目录路径。
$SHELL:当前使用的Shell程序路径。
$RANDOM:一个0到32767之间的随机数。
$LINENO:当前脚本的行号。
$IFS:当前脚本的字段分隔符。
$PS1:Shell提示符的格式。
$PS2:Shell续行提示符的格式
3)位置参数变量(传参)
位置参数变量是用来存储shell脚本的命令行参数的,他们包括$1,$2,$3等。例如,如果我们运行一个shell脚本并且传递两个参数,那么这两个参数会被分别赋值给$1和$2
4)用户自定义变量:用户自己定义的变量(常量,变量)
本地变量由shell程序定义的,仅在当前shell会话中可见,对于其他的shell和shell执行的程序是不可见的.
本地变量可以通过=符号来定义和赋值,例如myvar='hello'.
删除变量
unset 变量名
不能删除只读变量
变量和常量的区别:
常量赋值后,常驻当前会话,不可重新赋值.变量可以重新赋值.
常量不可以使用unset删除,变量可以使用unset删除
本地变量只在当前shell会话中可见,对于其他的shell和shell执行的程序是不可见的
单引号和双引号的区别:
单引号,引号内的内容原样输出(当做是一个字符串来处理)
双引号,引号内的内容,如果有变量,执行后再输出,通过$符号引用出来.
反引号 ``在里面执行linux命令
b=`pwd`
$():获取linux命令的执行的结果
${}叠加变量
{}大括号
1)扩展
对括号中的文件名进行扩展,以逗号分割的文件列表进行扩展,还有.分割的顺序文件列表起扩展作用
2)代码块,又被成为内部组
这个结构事实上创建了一个匿名函数,与$()中的命令不同,{}内的命令不会新开一个子shell运行,即脚本余下部分仍可使用括号内的变量,大括号内的命令用分号隔开,第一个命令与左大括号之间必须要有一个空格,相对于sql里面的子查询
IF语句-条件判断
基本语法
if [ 布尔类型 ];then ##注意判断的前后需要增加空格
commands
elif [ 布尔类型 ];then
commands
else
commands
比较类型:数值类型,字符串类型,文件比较
1)数值类型
-eq 等于则为真 [ “$a” -eq “$b” ]
-ne 不等于则为真 [ “$a” -ne “$b” ]
-gt 大于则为真 [ “$a” -gt “$b” ]
-ge 大于等于则为真 [ “$a” -ge “$b” ]
-lt 小于则为真 [ “$a” -lt “$b” ]
-le 小于等于则为真 [ “$a” -le “$b” ]
2)字符串比较
== 等于则为真 [ “$a” == “$b” ]
!= 不相等则为真 <> [ “$a” != “$b” ]
-z 字符串. 字符串的长度为零则为真 [ -z “$a” ]
-n 字符串 字符串的长度不为空则为真 [ -n “$a” ]
str1 > str2 str1大于str2为真 [ str1 \> str2 ]
str1 < str2 str1小于str2为真 [ str1 \< str2 ]
3)文件比较
-e 文件名. 如果文件或目录存在则为真 [ -e file ]
-r 文件名. 如果文件存在且可读则为真 [ -r file ]
-w 文件名. 如果文件存在且可写则为真 [ -w file ]
-x 文件名. 如果文件存在且可执行则为真 [ -x file ]
-s 文件名 如果文件存在且至少有一个字符则为真 [ -s file ] --判断空文件的用法
-d 文件名. 如果文件存在且为目录则为真(判断目录是否存在) [ -d file ] --判断目录
-f 文件名. 如果文件存在且为普通文件则为真 [ -f file ]
-c 文件名. 如果文件存在且为字符型文件则为真 [ -c file ]
-b 文件名.. 如果文件存在且为块特殊文件则为真 [ -b file ]
file1 -nt fle2 检查file1是否比file2新 [ file1 -nt file2 ] --根据日期来判断
file1 -ot file2 检查file1是否比file2旧 [ file1 -ot file2 ]
case分支判断
case $变量名 in #必须要转行符号
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
【注意事项】
case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
双分号“;;”表示命令序列结束,相当于java中的break。
最后的“*)”表示默认模式,相当于java中的default。
FOR循环
基本语法1
for (( 初始值;循环控制条件(结束的标志);变量变化 )) --第一行
do --第二行
程序体 (多条命令)
done --最后一行done代替结束。
基本语法2
for 变量 in 值1 值2 值3… --每个值之间以空格隔开,如果带空格的字符串需要用'' 来括着
do
程序
done
变体
for 变量 in 数组 ##in 后面可以放数组或者集合
do
程序
done
for区分 $*与$@ $i
两者相同:获取所有的参数
两者不同:$*把取回所有数据当做一个整体处理 'a b'
$@把取回所有数据当做一个一个的个体来处理 a b
%i显示具体的值
WHILE循环
基本语法:
while [ 条件判断式 ] ##注意点:[] 里面 条件判断式前后要加空格
do
程序体
累加器
done
continue:跳出当前这次循环继续下次循环
break:退出循环
shell-数组
自定义变量与数组有什么区别:
数组:存储一组数据 array=('a' 'b' 'c' 'd')
变量:是独立一个数据 var='a'
数组的取值
${}
1)按下表来取值:${数组名[下标]} 数组的下标从0开始
2)取出所有的值:${数组名[@]}或者 ${数组名[*]}
注意:*取出的值当成一个整体处理,@取出的值当成一个一个的个体处理
3)取出数组有几个值: ${#数组名[@]}或${#数组名[*]}
4)取出某个值的长度的字节数: ${#数组名[下标]}
数组的遍历
1)通过下标和for循环遍历
2)通过for i in 遍历数组
shell-函数
格式1:
function 函数名 {
commands
}
注意:{前面与函数名之间一定要有空格
{和}之间一定要分成多行来书写
格式2
在另外的shell文件引用到主文件的调用程序中的。(!!常用的格式!!!)
函数名(){
commands
}
# 使用 source 命令导入函数
source ./function.sh