1. 程式人生 > >Shell基礎整理一

Shell基礎整理一

文章目錄

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] ~]#