SHELL基础命令和语句
基础脚本实践
- 创建本地yum仓库的脚本
#!/bin/bash
cd /etc/yum.repos.d
mkdir bak
mv *.repo bak
mount /dev/sr0 /mnt
touch local.repo
cat >> local.repo <<EOF
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
EOF
yum clean all
yum makecache
- 调用硬件信息(cpu,内存)
#!/bin/bash
cpu=`lscpu |grep 型号名称|awk '{print $1,$2,$3,$4,$5,$6}'`
echo cpu=$cpu
Memtotal=`free -h | grep Mem | awk '{print $2}'`
echo Memtotal=$Memtotal
Memused=`free -h | grep Mem | awk '{print $3}'`
echo Memused=$Memused
Memfree=`free -h | grep Mem | awk '{print $4}'`
echo Memfree=$Memfree
Memshared=`free -h | grep Mem | awk '{print $5}'`
echo Memshared=$Memshared
Memavailable=`free -h | grep Mem | awk '{print $7}'`
echo Memavailable=$Memavailable
基础命令
expr
expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串
- expr 表达式
示例:
expr length “this is a test” #计算字串长度
expr substr “this is a test” 3 5 #抓取字串
expr index "sarasara" a #抓取第一个字符数字串出现的位置
expr 1000 + 900 #整数运算
read
read命令用于从标准输入读取数值
read 内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据
read [选项] 名字
选项 | 说明 |
---|---|
-a | 后跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符 |
-d | 后面跟一个标志符,其实只有其后的第一个字符有用,作为结束的标志 |
-p | 后面跟提示信息,即在输入前打印提示信息 |
-e | 在输入的时候可以使用命令补全功能 |
-n | 后跟一个数字,定义输入文本的长度,很实用 |
-r | 屏蔽\,如果没有该选项,则\作为一个转义字符,有的话 \就是个正常的字符了 |
-s | 安静模式,在输入字符时不再屏幕上显示,例如login时输入密码 |
-t | 后面跟秒数,定义输入字符的等待时间 |
-u | 后面跟fd,从文件描述符中读入,该文件描述符可以是exec新开启的 |
示例:
#!/bin/bash
read -p "输入名字:" name
echo "你输入的名字是 $name"
exit 0
bc
bc 命令是任意精度计算器语言,通常在linux下当计算器用(支持小数点运算)
- bc 选项 参数
选项 | 说明 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
^ | 指数 |
% | 余数 |
选项 | 说明 |
---|---|
-i | 强制进入交互式模式 |
-l | 定义使用的标准数学库 |
;或-w | 对POSIX bc的扩展给出警告信息 |
-q | 不打印正常的GNU bc环境信息 |
-v | 显示指令版本信息 |
-h | 显示指令的帮助信息 |
示例:
$ echo "15+5" | bc #通过管道符
20
seq
是一个序列的缩写,主要用来输出序列化的东西
- seq [选项] 首数 增量 尾数
选项 | 说明 |
---|---|
-f | 使用printf样式的浮点格式 |
-s | 使用指定字符串分隔数字(默认使用:\n) |
-w | 在列前添加0 使得宽度相同[自动补位] |
示例:
seq -w 1 10
awk
是一种处理文本文件的语言,是一个强大的文本分析工具
awk [选项参数] ‘script’ var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
选项 | 说明 |
---|---|
-F | 指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。 |
-v | 赋值一个用户定义变量。 |
-f | 从脚本文件中读取awk命令。 |
-mf | -mf选项限制分配给nnn的最大块数目 |
-mr | -mr选项限制记录的最大数目 |
示例:
#!/bin/bash
#cpu
cpu=`top -b -n 1 | grep Cpu | awk '{print $8}'|cut -f 1 -d '.'`
echo cpu=$cpu
if [ $cpu -gt 20 ]
then
echo "cpu空闲率为$cpu,cpu正常"
else
echo "cpu空闲率为$cpu,cpu警告"
fi
echo "-------------------------------------------------------------------------------------------------"
#内存
Memtotal=`free -m | grep Mem | awk '{print $2}'`
echo Memtotal=$Memtotal
Memused=`free -m | grep Mem | awk '{print $3}'`
echo Memused=$Memused
Memfree=`free -m | grep Mem | awk '{print $4}'`
echo Memfree=$Memfree
Memshared=`free -m | grep Mem | awk '{print $5}'`
echo Memshared=$Memshared
Memavailable=`free -m | grep Mem | awk '{print $7}'`
echo Memavailable=$Memavailable
if [ $Memfree -le 3500 ]
then
echo "内存已使用$Memfree,内存容量正常,还可以放心使用"
else
echo "内存已使用$Memfree,内存容量警告"
fi
echo "-------------------------------------------------------------------------------------------------"
#磁盘
root=`df -h | grep centos-root |awk -F '[ %]+' '{print $5}'`
if [[ $root -lt 90 ]]
then
echo "根目录使用情况为$root,容量正常,还可以放心使用"
else
echo "根目录使用情况为$root,容量警告"
fi
home=`df -h | grep centos-home |awk -F '[ %]+' '{print $5}'`
if [[ $root -lt 90 ]]
then
echo "home目录使用情况为$home,容量正常,还可以放心使用"
else
echo "home目录使用情况为$home,容量警告"
fi
var=`df -h | grep centos-var |awk -F '[ %]+' '{print $5}'`
if [[ $var -lt 90 ]]
then
echo "var目录使用情况为$var,容量正常,还可以放心使用"
else
echo "var目录使用情况为$var,容量警告"
fi
sda=`df -h | grep sda2 |awk -F '[ %]+' '{print $5}'`
if [[ $sda -lt 90 ]]
then
echo "sda磁盘使用情况为$sda,容量正常,还可以放心使用"
else
echo "sda磁盘使用情况为$sda,容量警告"
fi
sed
sed [-hnV][-e<script>][-f<script文件>][文本文件]
参数 | 说明 |
---|---|
-e | 以选项中指定的script来处理输入的文本文件 |
-f | 以选项中指定的script文件来处理输入的文本文件 |
-h | 显示帮助 |
-n | 仅显示script处理后的结果 |
-v | 显示版本信息 |
选项 | 说明 |
---|---|
a | 新增 |
c | 取代 |
d | 删除 |
i | 插入 |
p | 打印 |
s | 取代 |
示例:
sed -e 4a\newLine testfile
语句
if单分支语句
if [ 条件 ] then
语句
else
语句
fi
示例:(判断当前登录用户是否是root)
#!/bin/bash
host=`whoami`
if [ $host = 'root' ]
then
echo "是root用户"
else
echo "不是root用户"
fi
示例:(判断时间)
#!/bin/bash
time=`date +%H`
if [ $time -ge 6 ] && [ $time -le 10 ]
then
echo "早上好"
fi
if [ $time -ge 11 ] && [ $time -le 13 ]
then
echo "中午好"
fi
if [ $time -ge 14 ] && [ $time -le 18 ]
then
echo "下午好"
fi
if [ $time -ge 19 ] && [ $time -le 23 ]
then
echo "晚上好"
fi
if [ $time -ge 0 ] && [ $time -le 6 ]
then
echo "休息时间"
fi
if多分支语句
if [ 条件 ]
then
语句
elif
语句
fi
示例:(判断时间)
#!/bin/bash
time=`date +%H`
if [ $time -ge 6 ] && [ $time -le 10 ]
then
echo "早上好"
elif [ $time -ge 11 ] && [ $time -le 13 ]
then
echo "中午好"
elif [ $time -ge 14 ] && [ $time -le 18 ]
then
echo "下午好"
elif [ $time -ge 19 ] && [ $time -le 23 ]
then
echo "晚上好"
else
echo "休息时间"
fi
case分支语句
case 值 in
模式1)
command1
;;
模式2)
command1
;;
*)
command1
;;
esac
示例:(剪刀石头布小游戏)
#!/bin/bash
echo "现在开始进行石头剪刀布小游戏"
echo "请在下方输入1,2,3"
echo "1为石头,2为剪刀,3为布"
num=`echo $[RANDOM%3+1]`
read -p "输入你的数字: " you
case $you in
[1])
if [ 1 -eq $num ]
then
echo "平局"
elif [ 2 -eq $num ]
then
echo "你赢了"
else [ 3 -eq $num ]
echo "你输了"
fi
;;
[2])
if [ 1 -eq $num ]
then
echo "你输了"
elif [ 2 -eq $num ]
then
echo "平局"
else [ 3 -eq $num ]
echo "你赢了"
fi
;;
[3])
if [ 1 -eq $num ]
then
echo "你赢了"
elif [ 2 -eq $num ]
then
echo "你输了"
else [ 3 -eq $num ]
echo "平局"
fi
;;
esac
for循环语句
for循环的运作方式,是讲串行的元素意义取出,依序放入指定的变量中,然后重复执行含括的命令区域(在do和done 之间),直到所有元素取尽为止, 其中,串行是一些字符串的组合,彼此用$IFS所定义的分隔符(如空格符)隔开,这些字符串称为字段。
for 变量 in 串行
do
执行命令
done
示例:(ping网段)
#!/bin/bash
#ip="192.168.91."
for i in {1..254}
do
{
ping -c 3 192.168.91.$i &>/dev/null
if [ $? -eq 0 ]
#$? 上一次执行命令是否成功,成功为0,不成功为非0
then
echo $i主机通顺
else
echo $i主机不通顺
fi
}&
done
wait
while循环语句
while循环的条件测试是测真值
while 条件测试
do
执行命令
done
示例:(猜测价格)
#!/bin/bash
a=`echo $[RANDOM%1000+1]`
time=0
while true
do
read -p "请输入你猜的价格(1-1000):" b
let time++
if [ $a -eq $b ]
then
echo "恭喜你猜对了"
echo "你一共猜了 $time 次"
exit
elif [ $a -lt $b ]
then
echo "你猜的价格太高了"
else
echo "你猜的价格太低了"
fi
done
until循环语句
区别于while循环的条件测试是测真值,until循环则是测假值
until 条件测试
do
执行命令
done
示例:
#!/bin/bash
declare -i i=10
declare -i sum=0
until ((i>10))
do
let sum+=i
let ++i
done
echo $sum