Shell 基础

概述

# CentOS 默认的的解释器是 bash
echo $SHELL
/bin/bash

# 脚本开头指定解析器为 bash
#!/bin/bash

# 常用的执行方式
# 方式一:
bash/sh + 脚本的绝对路径/相对路径
# 方式二:
# 采用绝对路径/相对路径(但需要赋予执行权限chmod +x [文件名])
./hello.sh
# 方式三:
# 在脚本路径前加上 "." 或 "source"
. hello.sh

变量

# 系统预定义的变量
# 常用系统变量
$HOME、$PWD、$SHELL、$USER
# 自定义变量
# 定义变量:变量名=变量值,注意,=号前后不能有空格
# 撤销变量:unset 变量名
# 声明静态变量:readonly 变量,注意:不能 unset与重新赋值
# 变量名称可以由字母、数字和下划线组成,但是不能以数字开头, 环境变量名建议大写。
# 在 bash 中,变量默认类型都是字符串类型,无法直接进行数值运算。
# 变量的值如果有空格,需要使用双引号或单引号括起来。

# 定义变量 A
A=5
echo $A
# 给变量 A 重新赋值
A=8
echo $A
# 撤销变量 A
unset A
echo $A
# 声明静态的变量 B=2,不能 unset
readonly B=2
# 将变量升级为全局环境变量,可供其他shell使用
export [变量名]

# 特殊变量
# $n		(功能描述:n 为数字,$0 代表该脚本名称,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
# $#		(功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性)
# $*		(功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
# $@		(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
# $?		(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
# 运算符(双层圆括号或中括号)
# "$((运算式))" 或 "$[运算式]"
S=$(((2+3)*4))
S=$[(2+3)*4]
# 条件判断
test condition
[ condition ]		(注意 condition 前后要有空格)
# 注意:条件非空即为 true,[ atguigu ]返回 true,[ ]返回false。

# 常用判断条件

# (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)

# 例如
# 1.判断 23 是否大于等于 22
$ [ 23 -ge 22 ]
# 2.判断 hello.sh 是否具有写权限
$ [ -w helloworld.sh ]
# 3.判断某路径下是否存在某文件
[ -e [绝对路径/文件名] ]
# 4.多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)
&& echo OK || echo notOK --> OK
[ ] && echo OK || echo notOK --> notOK

流程控制

# if 单分支
if [ 条件判断式 ];then
	程序
fi
# 或者
if [ 条件判断式 ]
then
	程序
fi

# if 多分支
if [ 条件判断式 ]
then
	程序  
elif [ 条件判断式 ]
then
	程序
else
	程序
fi
# 注意:
# ① [ 条件判断式 ],中括号和条件判断式之间必须有空格
# ② if 后要有空格

# case 语句
case $变量名 in
"值1")
	如果变量的值等于值1,则执行程序1
;;  
"值2")
	如果变量的值等于值2,则执行程序2
;;
...省略其他分支...
*)
	如果变量的值都不是以上的值,则执行此程序
;;
esac

# 注意:
# ① case 行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
# ② 双分号“;;”表示命令序列结束,相当于 java 中的 break。
# ③ 最后的“*)”表示默认模式,相当于 java 中的 default。

# for 循环
# 语法①
for (( 初始值;循环控制条件;变量变化 ))
do
	程序
done
# 语法②
for 变量 in 值1 值2 值3 ...
do
	程序
done

# while 循环
while [ 条件判断式 ]
do
	程序
done
# read 读取控制台输入
read [选项] [参数]
-p: 指定读取值时的提示符
-t: 指定读取值时等待的时间(秒)如果-t 不加表示一直等待

函数

# 系统函数
# basename:去除路径中最后一个/及之前的内容,如有参数suffix(后缀),则去除后缀
basename [string/pathname] [suffix]
# dirname:去除所给路径的出去文件名部分
dirname [文件绝对路径]

# 自定义函数
[ function ] funname[()] 
{
	Action;
	[return int;]
}
# 经验技巧
# ① 必须在调用函数地方之前,先声明函数,shell 脚本是逐行运行。不会像其它语言一样先编译。
# ② 函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return 后跟数值 n(0-255)

正则表达式

^ # 匹配一行的开头
# 例如:匹配出所有以 a 开头的行
cat /etc/passwd | grep ^a

$ # 匹配一行的结束
# 例如:匹配出所有以 t 结尾的行
cat /etc/passwd | grep t$

. # 匹配一个任意的字符
# 例如
cat /etc/passwd | grep r..t
# 会匹配包含rabt,rbbt,rxdt,root... 的所有行

* # 不单独使用,他和上一个字符连用,表示匹配上一个字符 0 次或多次,例如
cat /etc/passwd | grep ro*t
# 会匹配包含 rt, rot, root, rooot, roooot... 的所有行

[ ] # 字符区间(中括号) 表示匹配某个范围内的一个字符,例如
[6,8] --> 匹配 6 或者 8  
[0-9] --> 匹配一个 0-9 的数字
[0-9]* --> 匹配任意长度的数字字符串
[a-z] --> 匹配一个 a-z 之间的字符
[a-z]* --> 匹配任意长度的字母字符串
[a-c, e-f] --> 匹配 a-c 或者 e-f 之间的任意一个字符

\ # 转义字符
# \ 表示转义,并不会单独使用。由于所有特殊字符都有其特定匹配模式,当我们想匹配某一特殊字符本身时(例如,我想找出所有包含'$'的行),就会碰到困难。此时我们就要将转义字符和特殊字符连用,来表示特殊字符本身,例如
cat /etc/passwd | grep 'a\$b'
就会匹配所有包含 'a$b' 的行。注意需要使用单引号将表达式引起来。

文本处理工具

cut # cut 的工作就是"剪",具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。
cut [选项参数] filename # 说明:默认分隔符是制表符
选项参数 功能
-f 列号,提取第几列
-d 分隔符,按照指定分隔符分割列,默认是制表符"\t"
-c 按字符进行切割 后加加 n 表示取第几列 比如 -c 1
awk # 一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。
awk [选项参数] ‘/pattern1/{action1} /pattern2/{action2}...’ filename
# pattern:表示 awk 在数据中查找的内容,就是匹配模式
# action:在找到匹配内容时所执行的一系列命令
选项参数 功能
-F 指定输入文件分隔符
-v 赋值一个用户定义变量
posted @ 2022-12-12 01:41  doubleuch  阅读(29)  评论(0编辑  收藏  举报