哈哈哈哈哈哈
shell 脚本入门
1)脚本格式
脚本以#!/bin/bash开头 (指定解析器)
2)第一个shell脚本:helloworld.sh

(3)脚本的常用执行方式

第二种:采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限+x)


原因:
前两种方式都是在当前shell中打开一个子shell来执行脚本内容,当脚本内容结束,则子shell关闭,回到父shell中。
第三种,也就是使用在脚本路径前加“.”或者 source 的方式,可以使脚本内容在当前shell里执行,而无需打开子shell!这也是为什么我们每次要修改完/ect/profile文件以后,需要source一下的原因。
开子shell与不开子shell的区别就在于环境变量的继承关系,如在子shell中设置的当前变量,父shell是不可见的。
变量
1.1 系统预定义变量
1)常用系统变量
2)案例实操
(1)查看系统变量的值
(2)显示当前shell中所有变量:set
1.2 自定义变量
1)基本语法
(1)定义变量:变量名=变量值,注意,=号前后不能有空格
(2)撤销变量:unset 变量名
(3)声明静态变量:readonly 变量,注意:不能unset
2)变量定义规则
(1)变量名称可以由字母、数字和下划线组成,但不能以数字开头,环境变量名建议大写。
(2)等号两侧不能由空格
(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
3)案例实操
(1)定义变量A
(2)给变量A重新赋值
(3)撤销变量A
(4)声明静态变量B=2,不能unset。
(5)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
(6)变量的值如果有空格,需要使用双引号或单引号括起来
(7)可把变量提升为全局环境变量,可使其他shell程序使用

1.2 特殊变量
1.2.1 $n
1)基本语法
$n (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
2)案例实操
1.3 $#
$# (功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性)。
2)案例实操
1.4 $*、$@
1)基本语法
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
2)案例实操
1.5 $?
1)基本语法
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个参数,由命令自己来决定),则证明上一个命令执行不正确了。)
2)案例实操
判断helloworld.sh 脚本是否正确执行
运算符
1)基本语法
“$((运算式))” 或 “[运算式]”
2)案例实操
计算(2+3)* 2 的值
条件判断
1)基本语法
2)常用判断条件
(1)两个整数之间比较
-eq 等于 (equal) -ne 不等于 (not equal)
-lt 小于 (less than) -le 小于等于 (less equal)
-gt 大于 (greater than) -ge 大于等于 (greater equal)
注:如果是字符串之间的比较,用等号“=”判断相等;用“!=”判断不等。
(2)按照文件权限进行判断
-r 有读的权限(read)
-w 有写的权限(write)
-x 有执行的权限(execute)
(3)按照文件类型进行判断
-e 文件存在(existence)
-f 文件存在并且是一个常规的文件(file)
-d 文件存在并且是一个目录(directory)
3)案例实操
(1)23是否大于等于22
(2)helloworld.sh 是否具有写权限
(3)/home/atguigu/cls.txt 目录中的文件是否存在
(4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)
流程控制(重点)
1.6 if判断
1)基本语法
(1)单分支
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
(2)多分支
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi
注意事项:
①[ 条件判断式 ],中括号和条件判断式之间必须有空格
②if后要有空格
2)案例实操
输入一个数字。如果是1,则输出 banzhang zhen shuai,如果是2,则输出 cls zhen mei,如果是其他,什么也不输出。
1.7 case 语句
1)基本语法
注意事项:
2)案例实操

1.8 for循环
1)基本语法1
for ((初始值;循环控制条件;变量变化))
do
程序
done
2)案例实操
从1加到100
3)基本语法2
for 变量 in 值1 值2 值3............
do
程序
done