1. shell 概述
🥞 shell 是一个命令行解释器,它能接受应用程序、用户 的命令,然后调用操作系统内核。
⭐ 还是一门 功能强大的编程语言,易编写、易调试、灵活性强。
2. shell入门
(1)脚本格式
🍔 脚本以 #!/bin/bash 开头(指定解析器)
(2)第一个脚本
① 新建文件
touch helloworld.sh
② 写入命令
vim helloworld.ss
③ 执行脚本
🍔 方式1:bash解析器帮忙执行(相对绝对路径都可)
🍑 bash + 脚本路径
🍑 sh + 脚本路径
🍔 方式2:脚本自己执行(必须具有可执行权限+x)
🍑 赋予权限
chmod -x helloworld,sh
🍑 执行脚本
./helloworld.sh
/home/helloworld.sh
🍔 方式3:. 或 source + 脚本路径
🥞 vim test.sh
a=5
🍑 . test.sh
🍑 source test.h
👨🏫 区别
前两种方式都是在当前 shell 中打开一个子 shell 来执行脚本内容,当脚本内容结束,则
子 shell 关闭,回到父 shell 中。
第三种,脚本在当前 shell 中执行,无需打开子 shell
主要区别在于 环境变量的继承,在 子shell 里边设定的变量是 局部的,子 shell 结束后就失效了
3. 变量
(1)系统预定义变量
🍔 常用的系统变量
$HOME 、 $PWD 、 $SHELL 、 $USER 等
🍔 查看系统变量的值
echo $变量名
🍔 显示当前 Shell 中所有变量
set
(2)自定义变量
🍔 语法
🍑 定义变量:变量名=变量值 【注意: = 号前后不能有空格,否者就给系统当成命令执行啦】
🍑 撤销变量:unset 变量名
🍑 声明静态变量:readonly 变量 【注意:不能unset】
🍑 局部变量升级为全局变量:export 变量名 【全局变量:子 继承 父,父 不受 子 影响】
🍔 规则
🍑 变量名:字母 数字 下划线 组成 【不能以数字开头】 环境变量名建议大写
🍑 等号两侧不能有空格,变量值带空格的字符串得用 “” 或 ‘’ 标注
🍑 bash 里边,变量默认类型为 字符串,无法进行数值运算
(3)特殊变量
🍔 参数:$数字
🍑 数字表示第几个参数,大于 10 的参数 需要用 {} 包含,例: ${10} ${1}
🍑 $0:调用的脚本名称
🍔 $#
🍑 获取所有输入参数的个数
🍔 $*、 $@
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)(集合或数组)
🍔 $?
🍑 判断最近执行的命令的返回状态 (0 表示正常,非 0 表示执行异常)
4. 运算符
🍔 语法
🍑 $((运算式)):运算式和其他语言的一致
🍑 $[运算式]:【注意:中括号运算式两端必须有空格,而且不能直接使用冲突的运算符(转义 或 使用特定符)】
例:
$[ 2*3+4 ] 或 $((2*3+4))
🍑 val = `expr 2 + 2` 【注意空格和反引号】
🍑 let 高级语言运算式 【注意:中间不能有空格】
例:let a++
🍔 算术运算符
🍔 关系运算符
🍔 逻辑运算符
5. 条件判断
🍔 语法
🍑 [ 判断式 ] :切记要判断式两端要加空格
🥞 条件非空 即为 true
🍟 [ haha ] 返回 true; [ ] 返回 false;
🍔 常用的判断条件
6. 流程判断
(1)if 单分支
👨🏫 中括号和表达式之间必须有空格
👨🏫 if 后面必须要有空格
🍑 方式1
if [ 条件判断式 ];then
程序
fi
🍑 方式2
if [ 条件判断式 ]
then
程序
fi
(2)if 多分支
🍑 结束标志:fi 是 if 的倒写
if [ 条件判断式1 ]
then
程序1
elif [ 条件判断式2 ]
then
程序2
else
程序3
fi
(3)case 多分支
👨🏫 case 行尾必须为 单词 in,每一个分支case值 行尾 必须为 右括号
👨🏫 双分号 ;; 表示命令序列结束,相当于 break
👨🏫 *):表示默认模式 default
🍑 基础语法
case $变量名 in
"值1")
程序1
;;
"值2")
程序2
;;
"值3")
程序3
;;
……
*)
默认程序
;;
esac
(4)for 循环
🍑 基础语法1
for ((初始化值;循环控制条件;变量迭代))
do
程序
done
🍑 基础语法2(类似增强for)
for 变量 in 值1 值2 值3 ...
do
程序
done
(5)while 循环
🍑 基础语法
while [ 条件判断式 ]
do
程序
done
7. 读取控制台输入
🍔 基础语法
🍑 read [-p -t] 变量名
🥞 -p:指定读取值时的提示符
🥞 -t:指定读取值时等待的时间(单位:秒)不写默认为无穷
🥞 变量名:指定存值的变量名
8. 函数
(1)系统函数
🍔 basename:截取文件名称
🍑 基础语法:basename [绝对路径] [后缀]
🍑 删除 绝对路径 最后一个 '/' 前的所有字符,并把 后缀 删掉
🍔 dirname:获取文件路径的绝对路径(去掉文件名就是路径)
🍑 基础语法:dirname 文件绝对路径
(2)自定义函数
🍔 基础语法
[function] 函数名 [()]
{
命令; ……
[return int;]
}
🍔 规则
🍑 函数必须声明在调用函数的地方之前 (shell 是逐行执行的)
🍑 函数返回值,只能通过 $? 系统变量获得,范围(0~255),不加 return $? 就是最后一条命令的运行
结果
9. 正则表达式
🍔 定义
正则表达式使用单个字符串来描述、匹配一系列符合某个语法规则的字符串。在很多文
本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。在 Linux 中,grep,
sed,awk 等文本处理工具都支持通过正则表达式进行模式匹配。
🍔 常用的特殊字符
🍑 ^a :匹配所有以 a 开头的行
🍑 $a :匹配所有以 a 结尾的行
🍑 . :表示匹配任意字符
🍑 a* :表示出现 任意 次 a
🍑 [ ] :字符区间
🥞 [6,8] :匹配 6 或 8
🥞 [0-9] :匹配 0 到 9 之间的任意数字
🥞 [0-9]* :匹配任意个 0 到 9 之间的数字
🥞 [a-z] :匹配一个 a-z 的任意字母
🥞 [a-c,e-f] :匹配 a-c 或 e-f 之间的任意字母
🍑 \ :转义符(单引号引注)
🥞 '\$':匹配特殊字符 $
10. 文本处理工具
(1)cut
🍑 cut [-f -d -c] 文件名
🥞 -f + 列号:表示提取第几列(2- :表示2到最后一列)
🥞 -d + 分隔符:按照分隔符分割列,默认是制表符 “\t”
🥞 -c + n:按字符进行分割,表示提取每行的第 n 个字符
(2)awk
🍔 基础语法
🍑 awk [-F -v] 'BEGIN{firstAction} /pattern1/{action1} /pattern2/{action2}...END{endAction}' filename
🥞 -F + 分隔符:指定输入文件 分隔符
🥞 -v + 定义一个变量:赋值一个用户自定义变量
🍟 pattern:表示 awk 在数据中查找的内容,就是 匹配模式
🍟 action:找到匹配内容 --> 执行命令
🌭 BEGIN:在所有数据读取之前执行
🌭 END:在所有数据执行之后执行
⭐ filename:读取数据的文件名
🍔 内置变量
🍑 FILENAME:文件名
🍑 NR:行号
🍑 NF:列号