Shell基礎整理一
阿新 • • 發佈:2018-11-01
文章目錄
Shell基礎整理
僅以此章記錄曾經奮鬥的歲月
變數
位置變數$1
~ $10
//位置變數$1,$2
//ping.sh
#!/bin/bash
ip=$1
ping ip && echo "ping $ip is up" || echo "ping $ip is down"
//演示位置變數$1
[ [email protected] ~]# sh ping.sh 192.999.999.999 114.114.114.114
ping 192.999.999.999 is down
[[email protected] ~]#
//演示位置變數$2
//ping.sh
#!/bin/bash
ip=$2
ping ip && echo "ping $ip is up" || echo "ping $ip is down"
[[email protected] ~]# sh ping.sh 192.999.999.999 114.114.114.114
ping 114.114.114.114 is up
[ [email protected] ~]#
預定義變數
$0 指令碼名
&* 所有的引數
[email protected] 所有的引數
$# 引數的個數
$$ 當前程序的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
[ [email protected] /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
[[email protected] /soft/scripts]#
整數運算->ping批量主機ip
//方法一: expr
[[email protected] ~]# expr 2 \* 2 // + #### \* /
4
[[email protected] ~]# expr 4 / 2
2
//方法二:$(($num1+$num2))
[[email protected] ~]# echo $((2*4)) // + #### * \
8
[[email protected] ~]# 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
[[email protected] ~]# let sum=2*3 ;echo $sum
6
[[email protected] ~]# let i++;echo $i
1
[[email protected] ~]#
案例:連續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
//方法四:$[]
[[email protected] ~]# echo $[2*3]
6
[[email protected] ~]# echo $[4/2]
2
[[email protected] ~]#
小數運算
echo "3*5"|bc
echo "scale=2;6/4"|bc
[[email protected] ~]# awk "BEGIN{print 1/2}"
0.5
[[email protected] ~]# awk 'BEGIN{print 1/2}'
0.5
[[email protected] ~]# echo "print 1.5/2"|python
0.75
[[email protected] ~]# echo 'print 1.5/2'|python
0.75
[[email protected] ~]#
【取數】變數內容的“刪除和替換和替代”
並不會真正的對變數做修改,只是引用
// 變數的“刪除”
[[email protected] ~]# url=www.sina.com.cn
[[email protected] ~]# echo ${#url} #獲取變數長度
15
[[email protected] ~]# echo ${url#*.} #從前往後匹配到第一個.“刪除”匹配的內容
sina.com.cn
[[email protected] ~]# echo ${url##*.} #從前往後匹配到最後一個.“刪除”匹配內容
cn
[[email protected] ~]# echo ${url%.*} #從後往前匹配到第一個.“刪除”匹配內容
www.sina.com
[[email protected] ~]# echo ${url%%.*} #從後往前匹配到最後一個.“刪除”匹配內容
www
[[email protected] ~]# echo $url
www.sina.com.cn
[[email protected] ~]#
// 變數的“替換”
[[email protected] ~]# echo ${url/sina/SINA}
www.SINA.com.cn
[[email protected] ~]# echo ${url//w/W}
WWW.sina.com.cn
[[email protected] ~]#
//變數的替代:${變數名-新的變數值},若變數有被賦值(包括空值)則不會被替代
[[email protected] ~]# echo ${var1} #沒被定義過得變數
[[email protected] ~]# echo ${var1-www} #被替代成www
www
[[email protected] ~]# echo ${url-www.baidu.com} #被定義過則無法替代
www.sina.com.cn
[[email protected] ~]# echo ${var1:-ccc} # :#### 未被定義過(包括空值)會把替代
ccc
[[email protected] ~]# echo ${var2:-ccc}
ccc
[[email protected] ~]# echo ${url:-ccc} # :-已經存在的無法被替代
www.sina.com.cn
[[email protected] ~]# echo ${var1}
[[email protected] ~]# echo ${var1:=111} # :=若沒有定義或空值則給變數賦值
111
[[email protected] ~]# echo ${var1}
111
[[email protected] ~]#
總結:${變數名-新的變數值},若變數有被賦值(包括空值)則不會被替代
${變數名:-新的變數值},若變數未定義(包括定義但為賦值空值)則也會被替代,但是不會被賦值
${變數名=新的變數值},若變數未定義,則給變數賦值;若有被定義或為空值,則替代但不會賦值
${變數名:=新的變數值}, 若變數未定義(包括定義但為賦值空值),則會給變數賦值;若已經有值則不會發生變化
只要是變數有值了,上面的任何操作都不會對變數產生任何變化,不能耍流氓!
* 適用於我想要你給個初始值,但是你沒有給,那我就給你個預設值
【取數】變數的索引及切片
// www.sina.com.cn
// 0123456789 變數對應的索引位置,從0開始計數
[[email protected] ~]# echo ${url}
www.sina.com.cn
[[email protected] ~]# echo ${url:3:5} #從第4個數開始擷取5個長度
.sina
[[email protected] ~]# echo ${url:4:4} #從第5個數開始擷取4個長度
sina
[[email protected] ~]# echo ${url:4} #從第4個數開始擷取後面所有
sina.com.cn
[[email protected] ~]#