centos shell脚本
查看shell
$ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.
/bin/bash
/bin/csh
/bin/dash
/bin/ksh
/bin/sh
/bin/tcsh
centos7的Linux启动过程
- BIOS-MBR-BootLoader(grub)-kernel-systemmd-系统初始化-shell
管道和管道符
- 管道和信号一样,是进程通信的方式之一
- 匿名管道(管道符)是shell编程常用的通信工具
- 管道符是“|”,将前一个命令执行的结果传递给后面的命令
重定向符号
- 一个进程默认会打开标准输入、标准输出、错误输出三个文件描述符
- 输入重定向符号“<"
read var < /path/to/file
- 输出重定向符号 “>" ">>" "2>" "&>"
echo 123 > /path/to/file
- 输入和输出重定向组合使用
cat > /path/to/file <<EOF
I am $USER
EOF
变量的赋值
- 变量名=变量值
- 使用let为变量赋值
- 将命令赋值给变量
- 将明亮结果赋值给变量,使用 $()或者``
$ cmd1=`ls /var`
$ cmd2=$(ls /var)
- 变量值有空格等特殊字符可以包含在" " 或''中
$ string1="hello bash"
$ echo $string1
$ string2='hello "bash"'
$ echo $string2
变量的引用
- ${变量名}作为对变量的引用
- echo ${变量名} 查看变量的值
- ${变量名}在部分情况下可省略为 $变量名
变量的默认作用范围
定义好的变量只针对当前的终端或者当前的shell生效,如果在当前的shell产生子shell或者当前shell的平行shell或者是shell的父进程都是不生效的。
# 定义一个变量
$ a=1
# 进入子shell
$ bash
# 查看之前定义的变量
$ echo $a
# 子进程定义一个变量
$ a=2
$ exit
# 查看子进程定义的变量
$ echo $a
1
- 变量的导出
- export
- 变量的删除
- unset
系统环境变量
环境变量:每个shell打开就可以获得的变量
- set和env命令
$?
上一条命令是否正确执行,非0是错误的$$
当前进程的pid$0
当前的进程名称$*
和$@
代表所有位置参赛$#
代表位置参数的位置$PATH
$PS1
位置变量
- $1 $2 ... $n
环境变量的配置文件
- /etc/profile
- /etc/profile.d
- ~/.bash_profile
- ~/.bashrc
- /etc/bashrc
数组
- 定义数组
- IPTS=(1.0.0.1 1.0.0.2 1.0.0.3)
- 显示数组的所有元素
- echo $(IPTS[@])
- 显示数组元素的个数
- echo $
- 显示数组的第一个元素
- echo $
转义与引用
- 特殊字符:一个字符不仅有字面意义,还有元意(meta-meaning)
#
注释;
分号\
转义"
和'
引号
- 常用的引用符号
"
双引号'
单引号- ` 反引号
运算符
- 赋值运算符
=
赋值运算符,用于算数赋值和字符串赋值- 使用unset取消变量的赋值
=
除了作为赋值运算符还可以作为测试操作符
- 算数运算符
- 基本运算符
+
加法-
减法*
乘法/
除法**
乘方%
取余
- 使用expr进行运算,expr只能支持整数,不支持浮点数, 符号和两个数字之间要有空格
- expr 5 + 4
- 对expr做运算后,把结果赋值,如下
- num1=
expr 4 + 5
- 基本运算符
- 数字常量
- 数字常量的使用方法
- let "变量名=变量值"
- 变量值使用0开头为八进制
- 变量值使用0x开头为十六进制
- 数字常量的使用方法
- 双圆括号是let命令的简化
- (( a = 10 ))
- (( a++ ))
- echo $(( 10+20 ))
特殊符号
- 引号
'
完全引用,若引号内有变量,直接显示"
不完全引用,对变量会解析变量- ` 执行命令
- 括号
()
(())
$()
- 单独使用圆括号会产生一个子shell
- 数组初始化ips=(ip1 ip2 ip3)
[]
[[]]
方括号- 单独使用方括号是测试(test)或数组元素功能
- 两个方括号表示测试表达式
< >
尖括号 重定向符号{}
花括号- 输出范围
- 文件复制 cp /etc/passwd
- 运算和逻辑符号
+
-
``*>
<
=
比较运算符&&
||
!
逻辑运算符
- 转义符号
\
转义某字符\n
普通字符转义后有不同的功能- ``` 特殊字符转义后,当作普通字符使用
#
注释;
命令分隔符- case语句的分隔符号转义;;
:
空指令.
和source命令相同~
家目录,
分隔目录
- 其他符号
*
通配符?
条件测试或通配符$
取值符号|
管道符&
后台运行_
空格
测试和判断
- 退出和退出状态
- exit
- exit 10 返回10给shell,返回非0位不正常退出
- $? 判断当前shell前一个进程是否正常退出
- 测试命令test
- test命令用于检查文件或者比较值
- test可以做一下测试:
- 文件测试
- 整数比较测试
- 字符串测试
- test测试语句可以简化为
[]
符号 []
符号还有扩展写法[[]]
支持&&
,||
,<
,>
- 使用if-then语句
if [ 测试条件成立 ] 或 命令返回值是否为0 then 执行相应命令 fi 结束
- 使用if-then-else语句
if [ 测试条件成立 ] then 执行相应命令 else 测试条件不成立,执行相应命令 fi 结束
- if-elif-else语句可以在条件不成立也允许相应的命令
if [ 测试条件成立 ] then 执行相应命令 elif [ 测试条件成立 ] then 执行相应命令 else 测试条件不成立,执行相应命令 fi 结束
- 嵌套if的使用
if [ 测试条件成立 ] then 执行相应命令 if [ 测试条件成立 ] then 执行相应命令 fi fi 结束
分支
- case语句和select语句可以构成分支
case "$变量" in
"情况1" )
命令...;;
"情况2" )
命令...;;
* )
命令... ;;
esac
循环
- 使用for循环遍历命令的执行结果
- for循环的语法
for 参数 in 列表 do 执行命令 done 封闭一个循环
- 使用反引号或$()方式执行命令,命令的结果当作列表处理
- 使用for循环遍历变量和文件的内容
# 创建mp3的文件
touch a.mp3 b.mp3 c.mp3
# 把mp3修改成mp4结尾的
for filename in "ls *.mp3"
do
mv $filename $(basename $filename .mp3).mp4
done
- c语言风格的for命令
for ((变量初始化;循环判断条件;变量变化))
do
循环执行命令
done
- while循环
while test测试是否成立
do
命令
done
- 死循环
while test测试一直成立
do
命令
done
- until循环
- until循环和while循环相反,循环测试为假时,执行循环,为真时循环停止
- break和continue语句
- 使用循环对命令参数的处理
# 对命令参数,如果是help 显示两次
while [ $# -ge 1 ]
do
if [ "$1" = "help" ]; then
echo $1 $1
fi
shift
done
函数
- 自定义函数
- 格式
function fname() { 命令 }
- 函数的执行
- fname
- 系统脚本
- 系统自建了函数库,可在脚本中引用
- /etc/init.d/functions
- 自建函数库
- 使用source 函数脚本文件 “导入” 函数
- 系统自建了函数库,可在脚本中引用
脚本优先级控制
- 可以使用nice和renice调整脚本优先级
- 避免出现不可控的死循环
- 死循环导致cpu占用过高
- 死循环导致死机
信号
- 捕获信号
- trap
- kill -9上不可阻塞的
计划任务
- 计划任务定义:
- 让计算机在指定时间运行程序
- 计划任务分类:
- 一次性计划任务
- at
# at执行一次性计划任务 $ at 20.42 at> echo hello > /tmp/hello.txt # ctrl +d 退出 at> <EOT> # atq查看执行任务 $ atq
- 周期性计划任务
- cron
- 配置方式
- crontab -e
- 查看现有的计划任务
- crontab -l
- 配置格式
- 分钟 小时 日期 月份 星期 执行的命令
- 注意命令的路径问题
- 配置方式
- cron
- 计划任务加锁
- 如果计算机不能按照预期时间运行
- anacontab延时计划任务
- /etc/cron.d/0hourly
- /etc/anacrontab
- /etc/cron.daily/logrotate
- flock锁文件
# -x表示排他锁,运行只能运行一次 flock -xn "/tmp/f.lock" -c "/root.a.sh"
- 一次性计划任务