shell脚本基础
格式要求:首行shebaang机制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
shell脚本用途:
自动化常用命令
执行系统管理和故障排除
创建简单的应用程序
处理文本或文件
bash中变量的种类
局部变量:生效范围为当前shell进程;对当前shell之外的其他shell进程,包括当前shell的子shell进程均无效
环境变量:生效范围为当前shell进程及其子进程
本地变量:生效范围为当前shell进程中某代码片段,通常指函数
位置变量:$1,$2,$3,...来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
特殊变量:$?,$0,$,$@,$#,$$,$!
变量赋值: name=root 变量叠加name="$name"hello
变量引用: $name 或者 ${name}
弱引用: " " 其中的变量引用会被替换为变量值
强引用: ' ' 其中的变量引用不会被替换为变量值,而保持原字符串
set: 显示已定义的所有变量
unset name: 删除变量
例:编写脚本显示当前主机信息
#!/bin/bash
aa=$[RANDOM%7+31]
bb="\e[1;${aa}m"
cc="\e[0m"
ipv4=$(ifconfig|sed -n '2p'|sed -r "s/.inet //"|sed -r "s/ .//")
echo "当前主机系统信息如下:"
echo -e 主机名: $bb$(hostname)$cc
echo -e ipv4地址:$bb$ipv4$cc
echo -e 操作系统版本: $bb$(cat /etc/redhat-release|cut -d. -f1-2)$cc
echo -e 内核版本 $bb$(uname -r)$cc
echo -e CPU型号:$bb$(lscpu |grep "Model name"|tail -n1|tr -s " "|cut -d ":" -f2)$cc
echo -e 内存大小:$bb$(free -mh|head -n2|tail -n1|tr -s " "|cut -d " " -f2)$cc
echo -e 硬盘容量:$bb$(fdisk -l|head -n2|tail -n1|cut -d, -f1|cut -d " " -f2-4)$cc
环境变量的声明、赋值:
export name=VALUE
显示所有环境变量:
env、printenv、export、declare -x
删除变量:
unset name
BASH内建的环境变量:
PATH、SHELL、USER、UID、HOME、PWD、SHLVL、LANG、MAIL、HOSTNAME、HISTSIZE、_下划线
只读变量:只能声明,但不能修改和删除
声明只读变量:
readonly name 、declare -r name
查看只读变量:
readonly -p
$1,$2,$3,..对应第1、第2、第3的参数
$0, 代表命令本身
$, 传递给脚本的所有参数,全部参数合为一个字符串
$@, 传递给脚本的所有参数,每个参数为独立字符串
$#, 传递给脚本的参数的个数
set -- 清空所有位置变量
$? 进程使用退出状态来报告成功或失败,0代表成功,1-255代表失败
bash有内建的随机数生成器变量:$RANDOM(0-32767)
例:计算/etc/passwd文件中第10和第20个用户的uid之和
##!/bin/bash
id1=$(cat /etc/passwd|head -n10|tail -n1|cut -d: -f3)
id2=$(cat /etc/passwd|head -n20|tail -n1|cut -d: -f3)
sum=$(($id1+$id2))
echo $sum
逻辑运算
true 1 , false 0
与:
1 与 1 = 1
1 与 0 = 0
0 与 1 = 0
0 与 0 = 0
或
1 或 1 = 1
1 或 0 = 1
0 或 1 = 1
0 或 0 = 0
非
!
测试命令: test EXPRESSION、[ EXPRESSION ] 、[[ EXPRESSION ]]
bash的数值测试
-v VAR 变量VAR是否设置
-gt 是否大于
-ge 是否大于等于
-eq 是否等于
-ne 是否不等于
-lt 是否小于
-le 是否小于等于
bash的字符串测试
= 是否等于
> ascii码是否大于ascii码
< 是否小于
!= 是否不等于
=~ 左侧字符串是否能够被右侧的PATTERN,此表达式一般用于[[]]中;扩展的正则表达式。
-z 字符串是否为空,空为真
-n 字符串是否不为空,不空为真 (用于字符串比较时用到的操作都应该使用引号)
bash的文件测试
-e 判断文件是否存在,存在为真
-b 判断是否为块设备文件
-c 判断是否为字符设备文件
-d 判断是否为目录文件
-f 判断是否为普通文件
-L或-h判断是否为符号连接文件
-p 判断是否为管道文件
-S 判断是否为套接字文件
bash的文件权限测试
-r 判断是否可读
-w 判断是否可写
-x 判断是否可执行
-u 判断是否拥有suid权限
-g 判断是否拥有sgid权限
-k 判断是否拥有sticky权限
bash的文件属性测试
-s 是否存在并且非空
-t 文件描述符是否在某终端已经打开
-N 文件自从上一次被读取之后是否被修改过
-O 当前有效用户是否为文件属主
-G 当前有效用户是否为文件属组
file1 -ef file2 file1是否是file2的硬链接
file1 -nt file2 file1是否比file2新
file1 -ot file2 file1是否比file2旧
bash的组合测试条件
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
COMMAND1 && COMMAND2 并且,短路与
COMMAND1 || COMMAND2 或者,短路或
!COMMAND 非
如 :[ -f "$FILE" ]&&[[ "$FILE" =~ .*.sh$ ]]
read输入命令
-p 指定要显示的提示
-s 静默输入,一般用于密码
-n 指定输入的字符长度
-d ‘字符’ 输入结束符
-t 等待输入的时间
echo abc | { read x y z;echo $x$y$z;} 使用管道 read会开启子shell
条件选择if语句
单分支
if 判断条件;then
条件为真的分支代码
fi
例:
#!/bin/bash
sda5=$(df -h|grep /dev/sda5|awk '{print$5}'|tr -d "%")
if [ $sda5 -ge 80 ]
then
echo "warning! /dev/sda5 is full"
fi
双分支
if 判断条件;then
条件为真的分支代码
else
条件为假的分支代码
fi
例:
#!/bin/bash
date=$(date "+%y%m%d")
size=$(du -sh /etc)
if [ -d /tmp/back ]
then
echo "date:$date">/tmp/back/info.log
echo "size:$size">>/tmp/back/info.log
cd /tmp/back
tar -zcvf etc-$date.tar.bz2 /etc info.log &>/dev/null
rm -rf /tmp/back/info.log
else
mkdir /tmp/back
echo "date:$date">/tmp/back/info.log
echo "size:$size">>/tmp/back/info.log
cd /tmp/back
tar -zcvf etc-$date.tar.bz2 /etc info.log &>/dev/null
rm -rf /tmp/back/info.log
fi
多分支
if 判断条件1;then
条件为真的分支代码
elif 判断条件2;then
条件2为真的分支代码
elif 判断条件3;then
条件3为真的分支代码
else
以上条件都为假的分支代码
fi
条件判断;case语句
case $变量 in
"选项1")
命令1
;;
"选项2")
命令2
;;
*)
命令3
;;
esac
bash的配置文件
全局配置:
/etc/profile
/etc/profile.d/.sh
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc
shell 登录两种方式
交互式登录:
执行顺序:/etc/profile --> /etc/profile.d/.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录:
执行顺序:/etc/profile.d/*.sh --> /etc/bashrc --> ~/.bashrc
profile类:为交互式登录的shell提供配置
bashrc类:为非交互式和交互式登录的shell提供配置
local命令
-i 不区分大小写的搜索
-n N 只列举前N个匹配项目
-r 使用基本正则表达式
find 路径 条件 动作
-maxdepth 最大搜索深度
-mindepth 最小搜索深度
-depth 先处理目录里文件,再处理目录
-regex 正则表达式
-path 不搜索目录里文件
-perm 600 精准权限查找
-perm -444 u g o 三者都有读权限
-perm + centos7改为/
-perm /222 u g o 三者有一个有写权限就可以
-ok-exec {} \; 对查找的结果进行处理
-empty 空
参数替换 xargs
echo {1..100}|xargs -n1
echo user{1..10}|xargs -n1 useradd
压缩、解压缩
compress
-d 解压缩
-c 结果输出至标准输出,不删除源文件
-v 显示详情
zcat file.z zcat file.gz bzcat file.bz2 xzcat file.xz 不显示解压缩的前提下查看文本文件内容
cat m | gzip > m.gz
lscpu | gzip > cpu.gz
bzip2 -k 保留原文件
tar -zcvf .tar.gz
tar -jcvf .tar.bz2
tar -Jcvf .tar.xz
split 分割一个文件为多个文件
rpm2cpio 包路径 | cpio -idv ./路径
-t预览
ldd 查看依赖的库
文本处理工具sed
选项:
-n 不输出模式空间内容到屏幕,即不自动打印
-e 多点编辑
-r 支持使用扩展正则表达式
-i 原文编辑
-i.bak 备份文件并原处编辑
编辑命令:
d 删除模式空间匹配的行,并立即启用下一轮循环
p 打印当前模式空间内容,追加到默认输出之后
a\ 在指定行后面追加文本,
i\ 在前面插入文本
c\ 替换行为单行或多行文本
w 保存至指定文件
s/// 替换查找 g 行内全局替换 p显示替换成功的行 w将替换成功的行保存至文件中
rpm包管理
rpm -ivh 安装并显示详细信息
rpm -qa 显示所有包
rpm -qf 查询指定文件在哪个包里
rpm -ql 查询安装位置
rpm -qR 查询依赖
rpm -e 卸载
rpm -V 包校验
yum 管理rpm包
yum源支持文件服务器 http、https、ftp、file
yum配置文件 /etc/yum.repos.d/.repo
yum -y install 包名 安装软件
yum search 包名 查询软件
yum -y reinstall 重新安装
yum repolist 显示仓库列表
yum remove 卸载程序包
yum update 升级程序包
yum info 查看程序包
yum clean all 清除缓存
ym history 查看安装历史
yum history info
yum history undo 撤销
yum history redo 重装
createrrepo 生成repodate
curl IP 查看网页内容
yum groupinstall......
dnf 新一代rpm软件包管理器
安装所需软件包
dnf-conf-0.6.4-2.sdl7.noarch.rpm
dnf-0.6.4-2.sdl7.noarch.rpm
python-dnf-0.6.4-2.sdl7.noarch.rpm
配置文件:/etc/dnf/dnf.conf
仓库文件:/etc/yum.repos.d/.repo
日志:/var/log/dnf.rpm.log
编译安装
C语言源代码编译安装三步骤:
1、./configure
2、make 根据Makefile文件,构建应用程序
3、make install 复制文件到相应路径
开发工具:
autoconf: 生成configure脚本
automake:生成Makefile.in