Shell基础整理
仅以此章记录曾经奋斗的岁月
变量
位置变量$1
~ $10
//位置变量$1,$2
//ping.sh
#!/bin/bash
ip=$1
ping ip && echo "ping $ip is up" || echo "ping $ip is down"
//演示位置变量$1
[root@localhost ~]# sh ping.sh 192.999.999.999 114.114.114.114
ping 192.999.999.999 is down
[root@localhost ~]#
//演示位置变量$2
//ping.sh
#!/bin/bash
ip=$2
ping ip && echo "ping $ip is up" || echo "ping $ip is down"
[root@localhost ~]# sh ping.sh 192.999.999.999 114.114.114.114
ping 114.114.114.114 is up
[root@localhost ~]#
预定义变量
$0 脚本名
&* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID
$! 后台运行的最后一个进程的PID
$? 上一个命名执行的结果,0表示成功
$- 显示shell使用的当前选项
$_ 之前命令的最后一个参数
//案例:脚本后面加上需要ping的ip
#!/usr/bin/bash
if [ $# -eq 0 ];then
echo "usage: $(basename $0) file" #basename去除路径只显示当前文件名
exit
fi
if [ ! -f $1 ];then
echo "$1 is not file"
exit
fi
for ip in $(cat ip.txt)
do
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "$ip is up"
else
echo "$ip is down"
fi
done
[root@mysql-master /soft/scripts]# sh ping.sh ip.txt
192.168.1.4 is up
192.168.1.3 is down
192.168.1.16 is up
192.168.1.17 is up
[root@mysql-master /soft/scripts]#
整数运算->ping批量主机ip
//方法一: expr
[root@mysql-master ~]# expr 2 \* 2 // + #### \* /
4
[root@mysql-master ~]# expr 4 / 2
2
//方法二:$(($num1+$num2))
[root@mysql-master ~]# echo $((2*4)) // + #### * \
8
[root@mysql-master ~]# echo $((4/2))
2
案例:输出内存占用百分百
#!/usr/bin/bash
Mem_used=`free -m|grep "^Mem"|awk '{print $3}'`
Mem_total=`free -m|grep "^Mem"|awk '{print $2}'`
Mem_percent=$((Mem_used*100/Mem_total))
echo "Memory used: $Mem_percent"
//方法三:let
[root@mysql-master ~]# let sum=2*3 ;echo $sum
6
[root@mysql-master ~]# let i++;echo $i
1
[root@mysql-master ~]#
案例:连续ping 192.168.1.16 ~ 192.168.1.18
#!/usr/bin/bash
i=16
while [ $i -le 18 ]
do
IP=192.168.1.$i
ping -c1 $IP &>/dev/null
if [ $? -eq 0 ];then
echo "$IP is up"
else
echo "$IP is down"
fi
let i++
done
//方法四:$[]
[root@mysql-master ~]# echo $[2*3]
6
[root@mysql-master ~]# echo $[4/2]
2
[root@mysql-master ~]#
小数运算
echo "3*5"|bc
echo "scale=2;6/4"|bc
[root@mysql-master ~]# awk "BEGIN{print 1/2}"
0.5
[root@mysql-master ~]# awk 'BEGIN{print 1/2}'
0.5
[root@mysql-master ~]# echo "print 1.5/2"|python
0.75
[root@mysql-master ~]# echo 'print 1.5/2'|python
0.75
[root@mysql-master ~]#
【取数】变量内容的“删除和替换和替代”
并不会真正的对变量做修改,只是引用
// 变量的“删除”
[root@mysql-master ~]# url=www.sina.com.cn
[root@mysql-master ~]# echo ${#url} #获取变量长度
15
[root@mysql-master ~]# echo ${url#*.} #从前往后匹配到第一个.“删除”匹配的内容
sina.com.cn
[root@mysql-master ~]# echo ${url##*.} #从前往后匹配到最后一个.“删除”匹配内容
cn
[root@mysql-master ~]# echo ${url%.*} #从后往前匹配到第一个.“删除”匹配内容
www.sina.com
[root@mysql-master ~]# echo ${url%%.*} #从后往前匹配到最后一个.“删除”匹配内容
www
[root@mysql-master ~]# echo $url
www.sina.com.cn
[root@mysql-master ~]#
// 变量的“替换”
[root@mysql-master ~]# echo ${url/sina/SINA}
www.SINA.com.cn
[root@mysql-master ~]# echo ${url//w/W}
WWW.sina.com.cn
[root@mysql-master ~]#
//变量的替代:${变量名-新的变量值},若变量有被赋值(包括空值)则不会被替代
[root@mysql-master ~]# echo ${var1} #没被定义过得变量
[root@mysql-master ~]# echo ${var1-www} #被替代成www
www
[root@mysql-master ~]# echo ${url-www.baidu.com} #被定义过则无法替代
www.sina.com.cn
[root@mysql-master ~]# echo ${var1:-ccc} # :#### 未被定义过(包括空值)会把替代
ccc
[root@mysql-master ~]# echo ${var2:-ccc}
ccc
[root@mysql-master ~]# echo ${url:-ccc} # :-已经存在的无法被替代
www.sina.com.cn
[root@mysql-master ~]# echo ${var1}
[root@mysql-master ~]# echo ${var1:=111} # :=若没有定义或空值则给变量赋值
111
[root@mysql-master ~]# echo ${var1}
111
[root@mysql-master ~]#
总结:${变量名-新的变量值},若变量有被赋值(包括空值)则不会被替代
${变量名:-新的变量值},若变量未定义(包括定义但为赋值空值)则也会被替代,但是不会被赋值
${变量名=新的变量值},若变量未定义,则给变量赋值;若有被定义或为空值,则替代但不会赋值
${变量名:=新的变量值}, 若变量未定义(包括定义但为赋值空值),则会给变量赋值;若已经有值则不会发生变化
只要是变量有值了,上面的任何操作都不会对变量产生任何变化,不能耍流氓!
* 适用于我想要你给个初始值,但是你没有给,那我就给你个默认值
【取数】变量的索引及切片
// www.sina.com.cn
// 0123456789 变量对应的索引位置,从0开始计数
[root@mysql-master ~]# echo ${url}
www.sina.com.cn
[root@mysql-master ~]# echo ${url:3:5} #从第4个数开始截取5个长度
.sina
[root@mysql-master ~]# echo ${url:4:4} #从第5个数开始截取4个长度
sina
[root@mysql-master ~]# echo ${url:4} #从第4个数开始截取后面所有
sina.com.cn
[root@mysql-master ~]#