文章目錄
- 1. 修改vim配置文件自動添加注釋
- 2. 故障案例:Windows上寫的Shell腳本上傳到Linux系統上運行報錯
- 3. 腳本運行方法
- 4. 變量
- 4.1 普通變量
- 4.2 環境變量
- 4.3 特殊變量
- 4.4 案例:書寫ping檢查腳本,檢查腳本傳入的第一個參數
- 4.5 面試題:$n,n大于9后會有什么問題?
- 5. if判斷
- 5.1 比較大小
- 5.2 案例:書寫ping檢查域名/ip的腳本
- 5.3 案例:檢查指定用戶是否存在
- 5.4 案例:書寫回收站腳本,執行rm的時候調用mv命令移動指定文件或目錄到/recycle目錄下
- 6. for循環
- 6.1 案例:批量添加用戶
- 6.2 案例:檢查系統中可登錄用戶的uid、gid信息
- 6.3 批量檢查ip/domain是否可以訪問
- 7. 思維導圖
1. 修改vim配置文件自動添加注釋
- vim的配置文件:
/etc/vimrc(Kylin)
,/etc/vim/vimrc(ubuntu)
- 添加下面配置:
autocmd BufNewFile *.py,*.cc,*.sh,*.java,*.bash,Dockerfile,docker-compose.yml exec ":call SetTitle()"func SetTitle() if expand("%:e") =~ 'sh\|bash' call setline(1,"#!/bin/bash")call setline(2, "##############################################################") call setline(3, "# File Name: ".expand("%"))call setline(4, "# Version: V1.0")call setline(5, "# Author: SunKexu")call setline(6, "# Organization: www.oldboyedu.com")call setline(7, "# Description:")call setline(8, "##############################################################")call setline(9, "")endif if expand("%") == 'Dockerfile' call setline(1, "#####################Dockerfile###############################")call setline(2, "##############################################################") call setline(3, "# File Name: ".expand("%"))call setline(4, "# Version: V1.0")call setline(5, "# Author: SunKexu")call setline(6, "# Organization: www.oldboyedu.com")call setline(7, "# Description:")call setline(8, "##############################################################")call setline(9, "")call setline(10, "FROM")call setline(11, "LABEL maintaniner='oldboy lidao@oldboyedu.com' author=lidao996")call setline(12, "CMD []")endif if expand("%") == 'docker-compose.yml' call setline(1, "#####################docker-compose###########################")call setline(2, "##############################################################") call setline(3, "# File Name: ".expand("%"))call setline(4, "# Version: V1.0")call setline(5, "# Author: SunKexu")call setline(6, "# Organization: www.oldboyedu.com")call setline(7, "# Description:")call setline(8, "##############################################################")call setline(9, "")call setline(10, "version: '3.3'")call setline(11, "services:")call setline(12, "volumes:")endif
endfunc
2. 故障案例:Windows上寫的Shell腳本上傳到Linux系統上運行報錯
- 原因:Windows下的回車符是\r\n,Linux下的回車符是\n,因此報錯。可以用
cat -n
查看詳細內容 - 解決方法:
dos2unix
,使用該命令將腳本格式轉換為Linux的格式
3. 腳本運行方法
方法 | 使用場景 |
---|---|
bash/sh | 最常用的方法,ubuntu中不能用sh |
路徑運行 | 不推薦使用,因為可能有權限問題導致失敗,需要給腳本執行權限 |
source/. | 運行腳本/加載帶有變量、自定義函數庫; 1.加載全局變量配置文件時使用 2.實現include功能,,加載子腳本 |
4. 變量
4.1 普通變量
變量命令規則:
- 不能以數字開頭
- 變量名應有具體含義
4.2 環境變量
- 全局變量,查看全局變量的命令:
env
export
:創建或修改全局變量
4.3 特殊變量
- 在腳本中使用
特殊變量 | 說明 |
---|---|
$n | n是數字,表示第n個腳本參數 |
$0 | 腳本名字 |
$# | 腳本參數個數 |
$*/$@ | 取出所有腳本參數 |
$? | 上一個命令的返回值;0表示正確,非0表示錯誤 |
4.4 案例:書寫ping檢查腳本,檢查腳本傳入的第一個參數
[root@oldboy99-Kylin /server/scripts]# cat ping.sh
#!/bin/bash
##############################################################
# File Name: ping.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
##############################################################ip=$1ping -c 1 $ip
[root@oldboy99-Kylin /server/scripts]# bash ping.sh jd.com
PING jd.com (211.144.27.126) 56(84) bytes of data.
64 bytes from 211.144.27.126 (211.144.27.126): icmp_seq=1 ttl=128 time=136 ms--- jd.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 136.231/136.231/136.231/0.000 ms
4.5 面試題:$n,n大于9后會有什么問題?
問題現象:
- $n不能作為整體被解析,需要用大括號使n作為一個整體
[root@oldboy99-Kylin /server/scripts]# cat test.sh
#!/bin/bash
##############################################################
# File Name: test.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
##############################################################echo $9 $10 $11
[root@oldboy99-Kylin /server/scripts]# bash test.sh {a..z}
i a0 a1
修改后:
[root@oldboy99-Kylin /server/scripts]# cat test.sh
#!/bin/bash
##############################################################
# File Name: test.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
##############################################################echo $9 ${10} ${11}
[root@oldboy99-Kylin /server/scripts]# bash test.sh {a..z}
i j k
5. if判斷
5.1 比較大小
判斷 | if符號 |
---|---|
等于 | -eq |
不等于 | -ne |
大于 | -gt |
大于等于 | -ge |
小于 | -lt |
小于等于 | -le |
5.2 案例:書寫ping檢查域名/ip的腳本
[root@oldboy99-Kylin /server/scripts]# cat ping.sh
#!/bin/bash
##############################################################
# File Name: ping.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
ip=$1# ping
ping -c2 $ip >/dev/null 2>&1# if
if [ $? -eq 0 ];thenecho "${ip} 可以訪問"
elseecho "${ip} 不能訪問"
fi[root@oldboy99-Kylin /server/scripts]# bash ping.sh jd.com
jd.com 可以訪問
修改版:
[root@oldboy99-Kylin /server/scripts]# cat ping.sh
#!/bin/bash
##############################################################
# File Name: ping.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
ip=$1# 檢查是否有參數
if [ $# -ne 1 ];thenecho "Usage:$0 ip/domain"exit 1 #退出腳本,返回值是1
fi# ping
ping -c2 $ip >/dev/null 2>&1# if
if [ $? -eq 0 ];thenecho "${ip} 可以訪問"
elseecho "${ip} 不能訪問"
fi[root@oldboy99-Kylin /server/scripts]# bash ping.sh www.qq.com
www.qq.com 可以訪問
5.3 案例:檢查指定用戶是否存在
[root@oldboy99-Kylin /server/scripts]# cat check_user.sh
#!/bin/bash
##############################################################
# File Name: check_user.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
user=$1# command
# 檢查參數個數
if [ $# -ne 1 ];thenecho "usage: $0 username"exit 1
fiid ${user} >/dev/null 2>&1
if [ $? -eq 0 ];thenecho "${user}用戶存在"
elseecho "${user}用戶不存在"fi[root@oldboy99-Kylin /server/scripts]# bash check_user.sh mysql
mysql用戶不存在
5.4 案例:書寫回收站腳本,執行rm的時候調用mv命令移動指定文件或目錄到/recycle目錄下
- mktemp:創建臨時文件或目錄
- -d:創建目錄
- -p 路徑:指定臨時文件或目錄存放位置
[root@oldboy99-Kylin /server/scripts]# cat recycle.sh
#!/bin/bash
##############################################################
# File Name: recycle.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
files="$*"
recy_dir="/recycle"# command
# 檢查參數個數
if [ $# -eq 0 ];thenecho "usage: $0 filename"exit 1
fi
# 檢查用戶是否為root
if [ $UID -ne 0 ];thenecho "請使用root刪除,普通用戶請使用mv自行操作"exit 2
fimv ${files} ${recy_dir} >>/dev/null 2>&1if [ $? -eq 0 ];thenecho "刪除成功!"
elseecho "刪除失敗"
fi
[root@oldboy99-Kylin /server/scripts]# mktemp -dp ./
./tmp.KKJkrjumyK
[root@oldboy99-Kylin /server/scripts]# alias |grep rm
alias rm='bash /server/scripts/recycle.sh'
[root@oldboy99-Kylin /server/scripts]# rm ./tmp.KKJkrjumyK/
刪除成功!
6. for循環
6.1 案例:批量添加用戶
[root@oldboy99-Kylin /server/scripts]# for name in oldboy{01..10}; do useradd $name;done
[root@oldboy99-Kylin /server/scripts]# tail /etc/passwd
oldboy01:x:1003:1003::/home/oldboy01:/bin/bash
oldboy02:x:1004:1004::/home/oldboy02:/bin/bash
oldboy03:x:1005:1005::/home/oldboy03:/bin/bash
oldboy04:x:1006:1006::/home/oldboy04:/bin/bash
oldboy05:x:1007:1007::/home/oldboy05:/bin/bash
oldboy06:x:1008:1008::/home/oldboy06:/bin/bash
oldboy07:x:1009:1009::/home/oldboy07:/bin/bash
oldboy08:x:1010:1010::/home/oldboy08:/bin/bash
oldboy09:x:1011:1011::/home/oldboy09:/bin/bash
oldboy10:x:1012:1012::/home/oldboy10:/bin/bash
6.2 案例:檢查系統中可登錄用戶的uid、gid信息
[root@oldboy99-Kylin /server/scripts]# cat check_login.sh
#!/bin/bash
##############################################################
# File Name: check_login.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
export LANG=en_US.UTF-8users=`grep '/bin/bash' /etc/passwd |awk -F ':' '{print $1}'`# for
for name in $users
douid=`id $name |awk -F '[ =]' '{print $2}'`gid=`id $name |awk -F '[ =]' '{print $4}'`group=`id $name |awk -F '[ =]' '{print $6}'`echo "用戶名:$name,用戶id:$uid,用戶組:$gid,用戶組信息:$group"
done
[root@oldboy99-Kylin /server/scripts]# bash check_login.sh
用戶名:root,用戶id:0(root),用戶組:0(root),用戶組信息:0(root)
用戶名:oldboy,用戶id:1000(oldboy),用戶組:1000(oldboy),用戶組信息:1000(oldboy)
用戶名:oldboy01,用戶id:1003(oldboy01),用戶組:1003(oldboy01),用戶組信息:1003(oldboy01)
用戶名:oldboy02,用戶id:1004(oldboy02),用戶組:1004(oldboy02),用戶組信息:1004(oldboy02)
用戶名:oldboy03,用戶id:1005(oldboy03),用戶組:1005(oldboy03),用戶組信息:1005(oldboy03)
用戶名:oldboy04,用戶id:1006(oldboy04),用戶組:1006(oldboy04),用戶組信息:1006(oldboy04)
用戶名:oldboy05,用戶id:1007(oldboy05),用戶組:1007(oldboy05),用戶組信息:1007(oldboy05)
用戶名:oldboy06,用戶id:1008(oldboy06),用戶組:1008(oldboy06),用戶組信息:1008(oldboy06)
用戶名:oldboy07,用戶id:1009(oldboy07),用戶組:1009(oldboy07),用戶組信息:1009(oldboy07)
用戶名:oldboy08,用戶id:1010(oldboy08),用戶組:1010(oldboy08),用戶組信息:1010(oldboy08)
用戶名:oldboy09,用戶id:1011(oldboy09),用戶組:1011(oldboy09),用戶組信息:1011(oldboy09)
用戶名:oldboy10,用戶id:1012(oldboy10),用戶組:1012(oldboy10),用戶組信息:1012(oldboy10)
6.3 批量檢查ip/domain是否可以訪問
[root@oldboy99-Kylin /server/scripts]# cat ping.sh
#!/bin/bash
##############################################################
# File Name: ping.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:
############################################################### vars
ips=$*# 檢查是否有參數
if [ $# -eq 0 ];thenecho "Usage:$0 ip/domain"exit 1 #退出腳本,返回值是1
fi# ping
for ip in $ips
doping -c2 $ip >/dev/null 2>&1# ifif [ $? -eq 0 ];thenecho "${ip} 可以訪問"elseecho "${ip} 不能訪問"
fi
done
[root@oldboy99-Kylin /server/scripts]# bash ping.sh qq.com baidu.com
qq.com 可以訪問
baidu.com 可以訪問
7. 思維導圖
【金山文檔 | WPS云文檔】 思維導圖 https://kdocs.cn/l/co3I7PtpTYQX