bash shell基礎
阿新 • • 發佈:2021-07-12
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!!!
......