Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用户Shell来启动、挂起、停止、甚至编写一个程序。
编写第一个Shell脚本
运行Shell脚本
1.将Shell脚本作为程序运行
2.将Shell脚本作为参数传递给Bash解释器(通过这种方式运行脚本,不需要在脚本文件的第一行指定解释器信息)
3.通过source命令执行脚本文件(linux下的source命令)
变量定义
-
Shell定义变量: 变量名=值(=两边不能有空格) 值 不包含任何空白符(例如空格、Tab 缩进等),那么可以不使用引号 值 包含了空白符,那么就必须使用引号包围起来
-
变量定义规则 变量名由数字、字母、下划线组成 必须以字母或者下划线开头 不能使用 Shell 里的关键字,并且一般为大写
设置环境变量
在另外一个shell程序中使用TOMCAT_HOME
位置参数变量
运行 Shell 脚本文件时我们可以给它传递一些参数,就可以使用位置参数变量。例如:./myshell.sh 100 200这个执行shell的命令行,可以将命令行参数传递到myshell脚本内。
变量 | 含义 |
---|---|
$n | n为数字,$0代表当前脚本的文件名,$1- 9 代 表 第 一 个 到 第 九 个 参 数 , 大 于 9 个 以 上 的 参 数 需 要 使 用 大 括 号 。 例 如 : 9代表第一个到第九个参数,大于9个以上的参数需要使用大括号。例如: 9代表第一个到第九个参数,大于9个以上的参数需要使用大括号。例如:{10} |
$* | 代表命令行中所有的参数,并把所有参数看成一个整体 |
$@ | 代表命令行中所有的参数,但是把每个参数区分对待 |
$# | 代表命令行中所有参数的个数 |
预定义变量
shell设计者事先已经定义好的变量,可以直接在shell脚本中使用。
变量 | 含义 |
---|---|
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
$? | 最后一次执行命令的返回状态,如果这个变量的值为0,则说明上一个命令执行正确,否则,上一个命令执行不正确 |
注释
-
# 单行注释
-
:<<! 多行注释 !
运算符
-
语法: 1. "$((运算式))" 或 "$[运算式]" 2. expr 变量 运算符 变量(注意 expr运算符两边要留空格 且 乘号需要转义 即 \*)
运算符
关系运算符(关系运算符只支持数字)
运算符 | 说明 | 举例 |
---|---|---|
-eq(equal) | 检测两个数是否相等 | [ $a -eq $b] |
-ne(not equal) | 不等于(检测两个数是否不相等) | [ $a -ne $b ] |
-gt( greater than ) | 大于(检测左边的数是否大于右边的 | )[ $a -gt $b ] |
-lt(less-than) | 小于(检测左边的数是否小于右边的) | [ $a -lt $b ] |
-ge(great than or equal ) | 大于等于(检测左边的数是否大于等于右边的) | [ $a -ge $b ] |
-le(less than or equal) | 小于等于(检测左边的数是否小于等于右边的) | [ $a -le $b ] |
布尔运算符
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算 | [ ! false ] |
-o | 或运算 | [ $a -lt 20 -o $b -gt 100 ] |
-a | 与运算 | [ $a -lt 20 -a $b -gt 100 ] |
逻辑运算符
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] |
|| | 逻辑的 OR | [[ $a -lt 100 |
字符串运算符
运算符 | 说明 | 举例 |
---|---|---|
= | 检测两个字符串是否相等 | [ $a = $b ] |
!= | 检测两个字符串是否不相等 | [ $a != $b ] |
-z | 检测字符串长度是否为0 | [ -z $a ] |
-n | 检测字符串长度是否不为0 | [ -n “$a” ] |
$ | 检测字符串是否为空 | [ $a ] |
文件测试运算符
运算符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件 | [ -b $file ] |
-c file | 检测文件是否是字符设备文件 | [ -c $file ] |
-d file | 检测文件是否是目录 | [ -d $file ] |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件) | [ -f $file ] |
-g file | 检测文件是否设置了 SGID 位 | [ -g $file ] |
-k file | 检测文件是否设置了粘着位(Sticky Bit) | [ -k $file ] |
-p file | 检测文件是否是有名管道 | [ -p $file ] |
-u file | 检测文件是否设置了 SUID 位 | [ -u $file ] |
-r file | 检测文件是否可读 | 。 [ -r $file ] |
-w file | 检测文件是否可写 | [ -w $file ] |
-x file | 检测文件是否可执行 | [ -x $file ] |
-s file | 检测文件是否为空(文件大小是否大于0) | [ -s $file ] |
-e file | 检测文件(包括目录)是否存在 | [ -e $file ] |
流程控制
-
if [ 条件判断式 ] then 程序 elif [ 条件判断式 ] then 程序 else 程序 fi 注意:[ 条件判断式 ]的中括号和条件判断式之间必须有空格
-
case $变量名 in "值1") 如果变量的值等于值1,则执行程序1 ;; "值2") 如果变量的值等于值2,则执行程序2 ;; ... 省略其他分支 ... *) 如果变量的值都不是以上的值,则执行此程序 ;; esac
-
for 变量 in 值1 值2 值3... do 程序 done ------------------------------------------------------------------------------------------------------------ for ((初始值; 循环控制条件; 变量变化)) do 程序 done
-
while [ 条件判断式 ] do 程序 done
函数
-
[ function ] function [()] { Aciotn; [return int;] } 可以带function funname() 定义,也可以直接funname() 定义,不带任何参数。
-
read读取控制台输入 read(选项)(参数) 选项: -p:指定读取值时的提示符 -t: 指定读取值时候等待的时间(秒),如果没有在指定的时间内输入,就不再等待了 参数: 变量;指定读取值的变量名