主要用于系统管理 自动化管理脚本
自定义变量
变量默认都是string类型
定义变量=两边不能有空格
例:
x=4
name="test 1"
变量调用
调用时开头需要加$符号
echo $x
变量查看
set [选项]
-u 未声明变量报错
变量删除
unset [变量名](变量名不加$)
环境变量
设置环境变量
export 变量名=变量值
或
变量名=变量值
export 变量名
env 查看环境变量
unset 变量名 删除(变量名不加$)
常见环境变量
PATH变量 系统查找命令的路径
echo $PATH 查看
临时生效
PATH="$PATH":/apps/sh 增加PATH变量值(变量叠加)
位置参数变量
$n n为数字 $0代表命令本身 $1-$9代表第一到第九个参数,十以上${10}
$* 返回命令行中所有参数 参数看成一个整体
$@ 返回命令行中所有参数 每个参数区别对待
$# 返回命令行中参数的个数
预定义变量
$? 最后一次执行的命令的返回状态 0 表示执行正确 非0 命令作者自定
$$ 当前进程的ID号(PID)
$! 后台运行的最后一个进程的ID号(PID)
接收键盘输入
read [选项] [变量名]
选项:
-p 提示信息 : 在等待read输入时,提示信息
-t 秒数: read命令会一直等待用户输入,此项指定等待时间
-n 字符数: read命令只接受指定的字符数,就会执行
-s 隐藏输入数据
shell运算符
1.declare 声明变量类型
declare[+/-][选项] 变量名
- 给变量设定类型属性
+ 取消变量的类型属性
-a 将变量声明为数组型
-i 整型
-x 环境变量
-r 只读变量 不能修改和删除
-p 显示指定变量的被声明的类型
例:b=1
c=2
declare -i a=$b+$c
echo $a
declare -p a
声明数组变量
arr[0]=a
arr[1]=a1
arr[2]=a2
declare -a arr[3]=a3 //两种声明方式
echo ${arr} 默认第一个下标的值
echo ${arr[2]} 下标为2的值
echo ${arr[*]} 所有
2.数值运算的方法
expr或let运算工具
例: aa=11
bb=22
cc=$(expr $aa + $bb) (注:左右两侧必须有空格)
let cc=$aa+$bb
$((运算式)) 或 $[运算式]
例:$(($aa + $bb))
$[$aa + $bb]
环境变量配置文件
重新加载配置文件
source 配置文件 或
. 配置文件
配置文件位置
/etc/profile 登录成功配置文件 设置基本环境变量 调用/etc/profile.d/*.sh 调用~/.bash_profile
/etc/profile.d/*.sh 启动/etc/profile.d/*.sh 下shell脚本 (加载语言)
~/.bash_profile 调用~/.bashrc 加载用户bin目录 环境变量
~/.bashrc 设置别名
/etc/bashrc 设置ps1 判断是否登录执行shell 调用/etc/profile.d/*.sh
根据顺序加载配置文件
~/.bash_logout 注销时生效的环境变量配置(默认是空的)
~/.bash_history 历史命令保存文件(退出登录后才把当次登录记录写入文件)
/etc/issue 本地终端登录提示信息
/etc/issue.net 远程终端提示信息(由ssh配置文件/etc/ssh/sshd_config决定是否显示,加入"Banner /etc/issue.net"才能显示,需要重启ssh服务)
/etc/motd 登录后提示信息
注:~用户家目录下 对当前用户生效
/etc/下的文件 对所有用户生效
正则表达式
通配符
* 匹配任意字符
?匹配任意一个字符
[] 匹配中括号内的一个字符
基础正则
* 前一个字符匹配0次或多次 grep "aa*" test.log
. 匹配除了换行符外任意的一个字符
^ 行首 grep "^aa$" test.log
$ 行尾
[] 匹配括号中指定的任意一个字符,只匹配一个字符 [^a-zA-Z0-9] [^]取反
\ 转译符
\{n\} 重复出现n次
\{n,\} 最少匹配n次
\{n,m\} 最少匹配n次到m次
grep 行提取命令
-v 取反
例:grep "正则" 文件名
ps -ef | grep "正则" 管道符
cut 列提取命令
-f 列号: 提取第几列
-d 分隔符: 按照指定分隔符分割(默认制表符)
例:cut -f 2 test.log 截取第二列
cut -f 2,4 -d ":" test.log 以":"分割截取第二列和第四列
限制: 需要分隔符,文件需要一定格式
printf
格式化输出命令
printf '输出类型输出格式' 输出内容
输出类型
%ns 输出字符串。n指代输出n个字符
%ni 输出整数。
%m.nf 输出浮点数 m和n是数字,指代输出整数位和小数位 例:%8.2f 输出8位 其中2位小数,6位整数
输出格式
\a 输出警告声音
\b 输出退格键(backspace键)
\f 清除屏幕
\n 换行
\r 回车
\t 水平输出退格键(tab键)
\v 垂直输出退格键(tab键)
例:printf '%s\t%s\t%s\n' 1 2 3 4 5 6 7 8 9
printf '%s' $(cat test.log)
awk 字符串截取
awk '条件1{动作1}条件2{动作2}...' 文件名
例:awk '{printf $2 "\t" $4 "\n"}' test.log ($2表示第二列 $4表示第四列,没有条件直接执行)
df -h | awk '{print $5}'
BEGIN
END
cat /etc/password | grep /bin/bash | awk 'BEGIN{FS=":"}{print $1 "\t" $3}'
sed 字符串替换
sed [选项] '[动作]' 文件名
选项:
-n 把经过sed命令的处理的行输出到屏幕
-e 允许输出多条sed命令编辑
-i 修改结果直接修改文件,而不是由屏幕输出(必须加-i 才能修改)
动作:
a 追加
c 行替换
i 插入
d 删除
p 打印
s 字符串替换
例:sed -n '2p' test.log 打印输出第二行
sed -i '2,4d' test.log 删除2到4行
sed -e '2,4d;s/aa/bb' test.log 删除2到4行 并 将全文aa替换成bb
sed '2a test' test.log 第二行追加test字符
sed '2i test' test.log 第二行前面插入test字符
sed '2c test' test.log 第二行替换test
sed '2s/aa/sb/g' test.log 第二行替换aa替换成sb
sort 排序命令
sort [选项] 文件名
选项:
-f 忽略大小写
-n 以数值型排序,默认使用字符串型
-r 反向排序
-t 指定分隔符,默认是制表符
-k n[,m] 按照指定的字段范围排序 第n个字段开始 m字段结束(默认到行尾)
例:sort /etc/passwd 按开头字母a-z排序
sort -r /etc/passwd 按开头字母z-a排序
sort -n -t ":" -k 3,3 /etc/passwd 根据:分隔符从第3个字段按数值排序
wc 统计命令
wc [选项] 文件名
选项:
-l 只统计行数
-w 只统计单词书
-m 只统计字符数
例: wc test.log
条件判断与流程控制
文件类型判断
-d 文件 判断文件是否为目录
-e 文件 判断文件是否存在
-f 文件 判断文件是否为普通文件
-r 文件 判断文件是否有读权限
-w 文件 判断文件是否有写权限
-x 文件 判断文件是否有执行权限
文件1 -nt 文件2 判断文件1的修改时间是否比文件2新
文件1 -ot 文件2 判断文件1的修改时间是否比文件2旧
文件1 -ef 文件2 文件1和文件2inode号一致,判断文件1和文件2是否为同一个文件
例: [ -d /apps/test ] && echo yes || echo no
字符串判断
-z 字符串 判断字符串是否为空
-n 字符串 判断字符串是否非空
字符串1 == 字符串2 判断字符串是否相等
字符串1 != 字符串2 判断字符串是否不相等
多重判断
条件1 -a 条件2 逻辑与
条件1 -o 条件2 逻辑或
!条件 条件取反
if 语句
if [ 条件表达 ];then
程序
fi
或者
if [ 条件判断 ]
then
程序
elif [ 条件判断 ]
then
程序
else
程序
fi
case 语句
case $变量名 in
"值1")
程序1
;;
"值2")
程序2
;;
*)
default程序
;;
esac
for 循环
for 变量 in 值1 值2 值3
do
程序
done
或
for ((初始值;循环控制条件;变量变化))
do
程序
done
while 循环
while [ 条件判断 ]
do
程序
done
until 循环(与while相反 条件成立终止循环)
until [ 条件判断 ]
do
程序
done