1. 查询系统支持的Shell语言
vi /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
2. Shell脚本的执行方式
所有Linux的命令都可以在Shell中被调用。
echo [-e] [内容] // 输出内容 -e 表示可以识别反斜杠内容。
脚本执行
- 一般脚本文件都以 .sh 结尾。
- 在脚本文件内容,开头写 #!/bin/bash,表示是使用的bash shell。
- 脚本写完之后,赋予执行权限 chmod 755 xxx.sh。
- 相对路径或者绝对路径 执行;或者bash xxx.sh(执行权限都不用赋予)。
- 对于在windows下写的shell脚本文件,回车符是^M , 但 是 l i n u x 下 是 ,但是linux下是 ,但是linux下是,可以使用dos2unix命令进行格式转换。
3. Bash 的基本功能
3.1 历史命令与补全
history [-c/-w] [存放历史命令的文件]
-c 表示清空历史命令
-w 刷新缓存,存入历史命令
存在~/.bash_history 中
上 下箭头可以取用历史命令
Tab可以实现命令或者文件名/目录名的补全
3.2 快捷键
/
3.3 输出重定向
命令 > 文件名 // 标准输出,覆盖形式
命令 >> 文件名 // 标准输出,追加形式
命令 2> 文件名 // 标准错误输出,覆盖形式
命令 2>> 文件名 // 标准错误输出,追加形式
-------->
命令 &> 文件名 // 标准输出和错误输出一起,覆盖形式
命令 &>> 文件名 // 标准输出和错误输出一起,追加形式
命令 > 文件名1 2>文件名2 // 标准输出到文件1,标准错误到文件2
3.4 多命令顺序执行与管道符
- command1; command2; command3… 按不同的顺序执行命令
- command1 && command2 && command3… 前一条命令成功,下一条才执行
- command1 || command2 || command3… 前一条失败了,下一条才会执行
管道符: command1 | command2 命令1的正确输出作为命令2的操作对象
grep [...] "搜索内容" 文件名 // 输出文件中带有搜索内容的行
-n 显示行号
--color=auto 显示颜色
3.5 通配符
常见的通配符
? 匹配一个任意字符
* 匹配0~n个字符
[] 匹配[]中的任意一个字符,[abc]一定匹配一个字符,a或者b或者c
[-] 同上,但是是一个范围内的,a-d
[^] 匹配一个字符,但是不可以是[]内的
特殊符号
\ 转义符,跟在\后面的特殊符号将失去特殊含义,变成普通字符
$ 调用变量的值,调用变量name的值,使用$name
$() 引用系统命令,在bash中会先执行它,`` 反引号同样的功能
# 在shell脚本中,#开头的行表示注释
' ' 单引号,特殊符号无特殊含义
“ ” 双引号,同上,但是例外 $ ` \三个拥有特殊含义
例子1
name=rc
echo $name
rc
echo '$name'
$name
echo "$name"
rc
例子2
a=$date()
echo a
今天的日期。。。。。
4. Bash 变量
4.1 用户自定义变量
- 变量命名规则:由字母、数字和下划线构成,但是不能用数字开头。
- bash中,变量默认是字符串型,如果要进行数值运算,必须指定变量类型为数值型。
- 变量用等号连接值,但是等号两边不可以为空格。如果变量的值有空格,则用“”或者’‘
name='Justin Ye'
变量叠加
aa=123
aa="$aa"456 // 或者 aa=${aa}456
echo $aa
123456
set 命令 可以查看系统所有的变量
unset … 删除变量
4.2 环境变量
用户自定义变量 只在当前的shell当中生效
环境变量 在当前shell和这个shell的子shell中生效,如果写入相应的配置文件,则可以在所有的shell中生效。
- 系统环境变量,一般大写,重点两个PATH
PATH // 系统查找命令的路径,一般寻找的是可执行文件
// 插一嘴,实际上Linux的命令是一种可执行文件,保存在PATH下的绝对路径中,而执行可执行文件,需要相对路径或者绝对路径才可以执行。
PATH="$PATH":....绝对路径 // 增加PATH
PS1 // 定义系统提示符的变量
2. 用户自定义环境变量
pstree 显示 shell 间的关系
export 自定义环境变量
env 查看环境变量
unset 删除变量
4.3 位置参数变量
向程序中传递需要的参数
$n :n 表示数字,$0 表示命令本身,
1
−
1-
1−…表示传入的参数
$* :将传入的参数看作一个整体
$@ :将传入的参数,每个独立对待
$# :代表命令行所有参数个数
// test.sh
for i in "$*"
do
echo $i
done
for j in "$@"
do
echo $j
done
./test.sh 1 2 3 4
1 2 3 4
1
2
3
4
4.4 预定义变量
- $? 判断上一条命令成功与否,0 表示成功,非 0 表示失败
- $$ 当前进程的进程号 PID
- $! 后台运行的最后一个进程的进程号 PID
- read 接受键盘输入
read -s -t 30 -p "......." name
-s 隐藏输出的信息
-t 系统等待时间
-p 输出到屏幕的内容(一般用于提示用户输入)
对于用户输入的内容,复制给 name
-n num 只允许输入 num 个字符,都不用回车
5 数值运算与运算符
declare 声明变量类型
declare [+/-][选项] 变量名
+ 取消属性
- 设定属性
-i 整数型
-x 环境变量 (一般还是用export)
-p 显示指定变量的被声明类型
例子
aa=11
bb=22
// 1
cc=$aa+$bb
cc=11+22
// 2
declare -i cc=$aa+$bb
cc=33
// 3
cc=$(expr $aa + $bb)
cc=33
// 4
cc=$(($aa+$bb))
cc=$[$aa+$bb]
变量测试
通过判断 x 的值,可以知道 y
6. 环境变量配置文件
环境变量配置文件存放位置:
// /etc 对所有用户生效
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
// 只对home 拥有者生效 /.表示隐藏文件或者目录
~/.bash_profile
~/.bashrc
优先级:????没看懂啊
其他配置文件和登录信息
- 注销时生效的环境变量配置文件
~/.bash_logout - 其它配置文件
~/bash_history // 可以帮助系统查错 - Shell 登录信息
本地终端登录信息 /etc/issue
远端登录信息 /etc/issue.net
7. Shell 编程
7.1 正则表达式
正则表达式:用于匹配文本中的字符串;
基础正则表达式
7.2 字符截取命令
-
cut 截取某一列的字符
-f num 截取第几列 列之间需要用制表符分开(Tab)
-d “:” 可以规定列之间的分割方式,":" 表示为分隔
eg: cut -d “:” -f 1,3 -
awk ‘条件1{动作1} 条件2{动作2}。。。’ 文件名
BEGIN END
FS=“:” 指定分隔符
awk 'BEGIN{FS=":"} {printf $1"\t" $6"\n"}' /etc/passwd
BEGIN 表示在读取/etc/passwd先执行{}
END 同理在读取完/。。。之后再执行
关系运算符
cat student.txt | grep -v Name | awk '$6>=87 {printf $2 "\n"}'
- sed : 轻量级流编辑器。主要用来将数据进行选取、替换、删除、新增的命令(一般用于屏幕输出的处理,对于文件的编辑最好还是使用vi,vim)
sed [选项] '动作' 文件名
-n 默认的sed输出全部内容到屏幕,-n 只输出经过 sed 处理的内容
-e 允许对输入数据应用多条 sed 命令编辑
-i 用sed修改的结果,直接修改读取数据的文件,而不是屏幕输出
a\ 追加 在当前行后添加一行或多行
c\ 行替换 用c后面的字符串替换原数据行
i\ 插入 在当前行前面插入一行或者多行
d 删除指定行 2,4d 删除234行
p 打印指定行
s 字符替换
// 行操作
sed -n '2p' student.txt
-n 表示只输出经过 sed 处理的内容
p 表示动作,打印输出; 2p 打印第二行
7.3 字符处理命令
- sort 排序命令
sort [选项] 文件名
-f 忽略大小写
-n 以数值型排序,sort 默认是字符串型排序
-r 反向排序
-t 指定分隔符,默认是Tab
-k n[,m] 指定范围排序
例子
sort -n -t ':' -k 3,3 /etc/passwd
将文件中每行的第三列数作为排序的标准
- wc 统计命令
-l 统计行数
-w 统计单词数
-m 统计字符数
7.4 条件判断
- 判断文件类型
-d 目录文件
-e 是否存在
-f 普通文件
test -e ...txt // [-e ...txt] 0真 1假
echo $? // 返回上一条命令的结果
[-d ...] && echo "yes" || echo "no"
-
判断文件的权限
-r
-w
-x
… -
两个文件之间进行比较
文件1 -nt 文件2 判断1比2是不是修改时间更新
文件1 -ot 文件2 判断1比2是不是修改时间更旧
文件1 -ef 文件2 判断1是否为硬链接
ln /root/student.txt /tmp/stu.txt
[(一定要有空格)/root/student.txt -ef /tmp/stu.txt && echo yes || echo no(一定要有空格)]
- 两个整数之间比较
- 字符串之间判断
name=sr
[ -z "$name" ]
- 多重条件判断
7.5 流程控制(if case for while until等)
7.5.1 if
if [ 条件判断式 ];then
程序
fi
// 或者
if [ 条件判断式 ]
then
程序
elif [ ... ]
then
程序
(exit 2) // 如果不进行下面的操作,就exit
else
...
fi
例子
#!/bin/bash
# 统计根分区使用率
rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" -f 1)
if [ $rate -ge 80 ]
then
echo "WARNING !!!"
fi
例子
#!/bin/bash
#备份mysql数据库
#同步系统时间
ntpdate asia.pool.ntp.org &>/dev/null
#把当前系统时间按照 "年月日" 格式赋予变量date
date=$(date +%y%m%d)
#统计mysql数据库的大小,并把大小赋予size变量
size=$(du -sh /var/lib/mysql)
if [ -d /tmp/dbbak ]
then
# 输出重定向,覆盖
echo "Date : $date!" >/tmp/dbbak/dbinfo.txt
# 输出重定向,追加
echo "Data size : $size" >>/tmp/dbbak/dbinfo.txt
cd /tmp/dbbak
# 打包并压缩 生成新文件,并将输入输出送去null
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
rm -rf /tmp/dbbak/dbinfo.txt
else
mkdir /tmp/dbbak
echo ""
echo ""
cd /tmp/dbbak
tar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt &>/dev/null
rm -rf /tmp/dbbak/dbinfo.txt
fi
例子
#!/bin/bash
#判断 apache 是否启动
# 使用nmap命令扫描服务器,并截取apache服务的状态,赋予变量port
port=$(nmap -sT 192.168.1.156 | grep tcp | grep http | awk '{print $2}')
if [ "$port" == "open"]
then
echo "..."
else
echo "..."
fi
7.5.2 case
case $变量名 in
"值1")
程序1
;;
"值2")
程序2
;;
*)
程序。。。
;;
esac
7.5.3 for
for 变量 in 值1 值2 值3
do
...
done
例子:批量解压缩脚本
#!/bin/bash
#进入压缩包所在的目录
cd /lamp
ls *.tar.gz > ls.log
for i in $(cat ls.log)
do
tar -zxf $i &>/dev/null
done
# 删除/lamp/ls.log所有内容
rm -rf /lamp/ls.log
例子:1 加到 100
#!/bin/bash
s=0
for((i=1;i<=100;i=i+1))
do
s=$(($s+Si))
done
echo "the sum is $s"
综合点的例子
#!/bin/bash
#批量添加指定数量的用户
read -p "....." -t 30 name
read...
if [ !-z "$name" -a !-z "$num" -a ! -z "$pass" ]
then
y=$(echo $num | sed 's/[0-9]//g')
if[ -z "$y" ]
then
for((i=1;i<=$num;i=i+1))
do
/usr/sbin/useradd $name $i &>/dev/null
echo $pass | /usr/bin/passwd --stdin $name $i &>/dev/null
done
fi
fi
7.5.4 while until
while [ 条件判断式 ]
do
程序
done
until [ 条件判断式 ]
do
程序
done