1. 程式人生 > 其它 >bash shell基礎

bash shell基礎

Bash shell基礎
一 介紹

類比:
shell語法《==============》python語法
bash直譯器《============》python直譯器
平臺 《=================》平臺

shell是一門解釋型、弱型別、動態語言

二 變數
登入使用者即進入互動式環境,與python的互動式環境都是一回事

應用示例

[root@localhost ~]# vim heartbeat.sh
[root@localhost ~]# cat heartbeat.sh 
#!/bin/bash
ip=192.168.11.20
ping -c1 $ip &>/dev/null
if [ $? = 0 ];then
    echo "host $ip is alive"
else
    echo "host $ip is down!!!"
fi
[root@localhost ~]# chmod +x heartbeat.sh 
[root@localhost ~]# ./heartbeat.sh 
host 192.168.11.20 is down!!!

三 引號對變數的影響

雙引號=》弱引用
[root@localhost ~]# name=egon
[root@localhost ~]# echo "hello $name"

雙引號=》強引用
[root@localhost ~]# echo 'hello $name'
hello $name

反引號=》取結果
[root@localhost ~]# today=`date +%F`
[root@localhost ~]# echo $today
2020-08-11
​[root@localhost ~]# today=$(date +%H:%M:%S)
[root@localhost ~]# echo $today
22:05:55
示例
[root@localhost ~]# tar czf `date +%F`_bak.tar.gz /tmp

變數值包含空格時,需要加上雙引號包含
[root@localhost ~]# msg="hello egon"
[root@localhost ~]# echo $msg
hello egon

四 變數作用域

set 檢視所有變數(包括自定變數和環境變數) env 檢視環境變數
環境變數: 在當前shell及子shell生效!
自定義變數: 僅在當前shell生效!
[root@localhost ~]# x=1
[root@localhost ~]# export x
[root@localhost ~]# bash
[root@localhost ~]# echo $x
1
系統環境變數配置檔案:(系統定義的)
1、/etc/profile
2、/etc/bashrc
3、~/.bashrc
4、~/.bash_profile
系統環境變數
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
[root@localhost ~]# echo $HOSTNAME
localhost.localdomain
[root@localhost ~]# echo $USER
root
[root@localhost ~]# echo $UID
0
[root@localhost ~]# echo $SHELL
/bin/bash
[root@localhost ~]# echo $HISTSIZE
5
[root@localhost ~]# echo $MAIL
/var/spool/mail/root
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

五 影響bash shell的檔案

系統環境變數配置檔案:(系統定義的)
1、/etc/profile
2、/etc/bashrc
3、~/.bashrc
4、~/.bash_profile
上述四個檔案在登入shell即su - egon時的執行順序是
login shell:        
    1. /etc/profile         系統級別配置檔案
    2. ~/.bash_profile      使用者級別配置檔案 (使用者自定義的環境變數) 
    3. ~/.bashrc            使用者級 (定義別名)
    4. /etc/bashrc          系統級

在非登入shell即su egon時,執行的檔案只有兩個,順序為
non-login shell: 
    1. ~/.bashrc            使用者級
    2. /etc/bashrc          系統級

Ps:
1、vim /home/user1/.bash_history -------每次登陸使用者的操作都記錄其中
2、su - user1進行操作然後退出,檢視該檔案內容
3、vim /home/user1/.bash_logout --------新增一條  
4、>/home/user1/.bash_history這樣每次退出使用者後都會自動清空~/.bash_history中的內容  

六 元字元

shell語法中的特殊字元
1、`` 與$():取命令的結果
[root@localhost ~]# echo `pwd`
[root@localhost ~]# echo $(pwd)
不一樣的地方在於$()可以巢狀,而``不能巢狀
[root@localhost ~]# echo $(ls $(pwd))

2、~家目錄

3、.與..

4、!取反
[root@localhost ~]# find /test ! -name 1.txt

5、@無特殊意義

6、#註釋

7、$取變數值
[root@localhost ~]# echo $x

8、%、-、+運算子
  # 數學運算
  # 1、bc是比較常用的linux計算工具了,而且支援浮點運算:
   [root@localhost ~]# res=`echo "scale=2;5.0/6.0"|bc`
  # 2、expr不支援浮點數計算。而且要注意數字與運算子中的空格
  [root@localhost ~]# res=`expr 1+1` # 注意:要有空格
  # 3、$(()) 同expr,不支援浮點數運算
   [root@localhost ~]# echo $((1+1))
  #4、let 不支援浮點數運算,而且不支援直接輸出,只能賦值
  [root@localhost ~]# let res=50/5
  [root@localhost ~]# echo $res

9、^同!一樣

10、*任意多個字元

11、()在子shell中執行
[root@localhost ~]# (umask 066;touch a.txt) # umask的設定只在子shell中有效

12、_下劃線:無特殊意義,可以用於名字的宣告

13、=賦值,判斷相等性
[root@localhost ~]# [ 1 = 1 ] # 條件1 = 1的左右兩邊必須有空格

14、|管道:把一個程序的處理結果傳遞給另外一個程序
[root@localhost ~]# ps aux | grep python
xargs引數傳遞,把上一個命令的結果作為下一個命令的引數
[root@localhost ~]# find /home/ -type d -name "test*" |xargs ls

15、\轉義特殊字元
[root@localhost ~]# echo $RMB # 預設會當成變數
​[root@localhost ~]# echo '$RMB' # 取消特殊意義
[root@localhost ~]# echo \$RMB # 取消特殊意義

16、[]條件測試,後續會詳細介紹

17、引號
'' 強引用(在單引號中都視為普通字元)
" " 弱引用 (在雙引號中保留變數)

18、;與&&與||連線多條命令
# ; 不論前一條命令執行成功與否,都會執行後續命令
# && 只有前一條命令執行成功,才會執行後續命令
# || 前一條命令執行不成功才會執行後續命令

19、/路徑分隔符

20、{}包含

21、&後臺執行
[root@localhost home]# echo "hello";sleep 3;echo "world" &

22、重定向
> >> 輸出重定向
< << 輸入重定向

23、?任意一個字元
[root@localhost ~]# ls a?c.txt

24、範圍中的任意一個字元 [12] [ac] [a-z] [0-9]
[root@localhost ~]# ls a[A-Z]c # 不區分大小寫

七 Bash SHELL基礎

例1
[root@localhost ~]# vim if.sh
[root@localhost ~]# cat if.sh 
#!/usr/bin/env bash
domain="www.baidu.com"
ping -c2 $domain &>/dev/null
​
if [ $? = 0 ];then
    echo "network is ok"
else
    echo "network is down!!!"
fi
[root@localhost ~]# chmod +x if.sh 
[root@localhost ~]# ./if.sh 
network is ok
例2
[root@localhost ~]# vim for.sh
[root@localhost ~]# ll for.sh 
-rw-r--r--. 1 root root 61 8月  13 16:17 for.sh
[root@localhost ~]# . for.sh 
egon
tom
jack
例3
[root@localhost ~]# vim for2.sh 
[root@localhost ~]# cat for2.sh 
#!/bin/bash
for i in {1..10}
do
    ip=192.168.12.$i
    ping -c1 $ip &>/dev/null
    if [ $? = 0 ];then
        echo "$i is up"
    else
        echo "$i is down!!!"
    fi
done
[root@localhost ~]# vim for2.sh 
[root@localhost ~]# source for2.sh 
192.168.12.1 is up
192.168.12.2 is down!!!
192.168.12.3 is up
192.168.12.4 is down!!!
......