入門shell腳本基礎及原理
1.特殊變量
$#:查看變量參數的個數
$0:查看腳本的名字
$!:查看shell後臺的pid
$@:查看傳遞腳本所有參數的列表
$*:查看所有參數的列表,單字符串形式顯示
$$:腳本本身進程的ID
$?:上一條命令的結果,顯示0則成功,不是0則失敗
2.內部環境變量
$PATH SHELL 當前使用的shell UID 當前的用戶環境 {0|其它數字}={root|其它用戶} HOME 當前使用的用戶目錄 PWD 當前的目錄 HISTFILE 歷史命令路徑 PS1 #[\u@\h \W]\$ 用戶@主機名\目錄\$
3.整數以及字符判斷
3.1整數判斷
-eq 測試倆個整數是否相等 (equal) -ne 測試倆個整數是否不等 (unequal) -gt 測試一個數是否大於一個數 (greater than) -lt 測試一個數是否小於一個數 (less than) -ge 測試一個數大於或等於 -le 測試一個數小於或等於
3.2字符測試
=~ 測試是否被正則表達式匹配 -z "string" 檢測字符是否為空,空則真,不空則假 如: [ -z "" ]為真空則為真 -n "string" 檢測字符是否不空,不空則真,不空則假 字符相比較大小用[[ ]],比的是第一個字母(a-zA-Z)都是大寫或者都是小寫比較ascii值 越大則越大 有大寫又有小寫則A>a B>b 但是A不大於b的情況 [root@slave02 ~]# [[ "A" < "B" ]] [root@slave02 ~]# echo $? 0 [root@slave02 ~]# [[ "a" < "b" ]] [root@slave02 ~]# echo $? 0
4.文件判斷
-e:文件是否存在 -b:測試是否塊設備文件 -c:測試是否字符設備文件 -f:測試是否普通文件 -d:測試是否目錄 -h:測試是否符號鏈接文件 -L:測試是否是符號鏈接文件 -p:測試是否是命名管道文件 -S:測試是否是套接字文件 權限相關: -r 讀 -w 寫 -x 執行 特殊權限 -g -u -k 等
5.read輸入
選項: -p:指定提示符 -t:指定提示等待的時間(秒)
6.if判斷
多分支: if [ 條件 ];then statement1 ..... elif [ 條件2 ];then statement2 .... else statement3 .... fi
7.案例選擇判斷
case $變量名 in 'value1') statement ... ;; 'value2') statement ... ;; *) statement .. ;; esac #case支持的通配符: * //任意長度任意字符 ? //任意單個字符 [] //指字范圍內的任意單個字符 start|START //倆種選擇
8.for循環
第一種: for ((expr1;expr2;expr3)) # expr1:初始值條件 #expr2:循環的范圍進行退出 #expr3:變量的值使用 { 循環體 } for ((expr1;expr2;expr3));do 循環體 done 第二種: for 變量 in 列表; do 循環體 done
9.while循環
while循環用於不知道循環次數的場景,註意有退出條件 while [ 條件 ];do statement ..... done
10.深入練習
1.寫一個腳本,輸入三個數字進行相應的加減乘除
[root@slave02 ~]# cat script01.sh #!/bin/bash a=$1 b=$2 c=$3 num1=$[$a+$b+$c] num2=$[$a-$b-$c] num3=$[$a*$b*$c] echo "$a + $b + $c" = $num1 echo "$a - $b - $c" = $num2 echo "$a * $b * $c" = $num3 awk "BEGIN{printf \"$a/$b/$c=%.2f\n\",$a/$b/$c}" [root@slave02 ~]# source script01.sh 100 10 9 100 + 10 + 9 = 119 100 - 10 - 9 = 81 100 * 10 * 9 = 9000 100/10/9=1.11
2.猜數字遊戲
規則:指定一個數字,隻要猜到瞭這個數字則過關,否則顯示數字大瞭或者數字小瞭
[root@master ~]# cat test03.sh #!/bin/bash nums=99 read -p "please enter a number: " num if [ $num -gt $nums ];then echo "數字大瞭" elif [ $num -lt $nums ];then echo "數字小瞭" else echo "猜對" fi [root@master ~]# . test03.sh please enter a number: 10 數字小瞭 [root@master ~]# . test03.sh please enter a number: 100 數字大瞭 [root@master ~]# . test03.sh please enter a number: 99 猜對
3.寫一個腳本,讓nginx服務設置開機自啟
#$0是nginx本身 $1是變量對應著下面的start|stop|restart|status [root@192 init.d]# pwd /etc/init.d [root@192 init.d]# cat nginx #!/bin/bash case $1 in 'start') /usr/local/nginx/sbin/nginx ;; 'stop') /usr/local/nginx/sbin/nginx -s stop ;; 'restart') /usr/local/nginx/sbin/nginx -s stop /usr/local/nginx/sbin/nginx ;; 'status') num=$(ps -ef |grep -v 'grep'|grep -c nginx:) if [ $num -eq 0 ];then echo "nginx is stoped" else echo "nginx is running" fi ;; *) echo "Usage: service $0 start|stop|restart|status" ;; esac #當判斷有nginx進程數量則認為開啟服務,否則認為服務開啟失敗
4.利用for循環,創建user序號1-100的用戶
#創建用戶user1-100 [root@master ~]# cat test05.sh #!/bin/bash for (( i=1;i<=100;i++));do useradd user$i id user$i &>/dev/null if [ $? -eq 0 ];then #隻要判斷用戶成功,$?才會顯示0,顯示0則代表執行下一條命令,否則顯示user以及存在 echo "success" else echo "user is exis" fi done
5.利用while循環,計算1+2…100的值
[root@slave02 ~]# cat which.sh #!/bin/bash s=0 #初始值0 i=1 #判斷的數值,最終到100停止 while [ $i -le 100 ];do s=$[$s+$i] i=$[$i+1] #自增加數 done echo $s [root@slave02 ~]# source which.sh 5050 #隨便輸入一個數字進行計算的話,把100改為$1即可
6.apache簡單的一個編譯部署腳本
1.一般項目或者腳本,文件,放在相應的位置裡,方便查找 [root@slave02 tmp]# pwd /tmp [root@slave02 tmp]# ls apache [root@slave02 apache]# ls install_apache.sh soft [root@slave02 soft]# ls apr-1.7.0.tar.bz2 apr-util-1.6.1.tar.bz2 httpd-2.4.48.tar.bz2 httpd.service [root@slave02 apache]# cat install_apache.sh #!/bin/bash echo "歡迎使用此腳本" apachedir=/usr/local/apache if [ $UID -ne 0 ];then echo "夥計,請使用管理員身份運行" fi echo "正在安裝依賴包..." yum -y install epel-release bzip2 "@Development Tools" &>/dev/null yum -y install openssl-devel pcre-devel expat-devel libtool gcc gcc-c++ make &>/dev/null id apache &>/dev/null if [ $? -ne 0 ];then useradd -r -M -s /sbin/nologin apache fi cd /tmp/apache/soft/ tar -xf apr-1.7.0.tar.bz2 tar -xf apr-util-1.6.1.tar.bz2 tar -xf httpd-2.4.48.tar.bz2 sed -i '/ $RM "$cfgfile"/d' apr-1.7.0/configure echo "正在編譯安裝apr,請聽聽歌放松放松......." cd apr-1.7.0/ [ ! -d /usr/local/apr ] if [ $? -eq 0 ];then ./configure --prefix=/usr/local/apr && make && make install &>/dev/null else echo "apr已經安裝" fi cd ../apr-util-1.6.1/ [ ! -d /usr/local/apr-util ] if [ $? -eq 0 ];then ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr && make && make install &/dev/null else echo "apr-util已經安裝" fi cd ../httpd-2.4.48/ [ ! -d /usr/local/apache/ ] if [ $? -eq 0 ];then ./configure --prefix=$apachedir \ --sysconfdir=/etc/httpd24 \ --enable-so \ --enable-ssl \ --enable-cgi \ --enable-rewrite \ --with-zlib \ --with-pcre \ --with-apr=/usr/local/apr \ --with-apr-util=/usr/local/apr-util/ \ --enable-modules=most \ --enable-mpms-shared=all \ --with-mpm=prefork make && make install &>/dev/null else echo "httpd已經安裝" fi cd #有影響的加判斷,沒影響的忽略 echo "export PATH=$apachedir/bin:\$PATH" > /etc/profile.d/httpd.sh ln -s $apachedir/include/ /usr/include/apache &>/dev/null grep 'apache/man' /etc/man_db.conf &>/dev/null if [ $? -eq 1 ];then sed -i "20aMANDATORY_MANPATH $apachedir/man" /etc/man_db.conf else echo "apache is help exists" fi [ ! -f /usr/lib/systemd/system/httpd.service ] if [ $? -eq 0 ];then cp /clq/apache/soft/httpd.service /usr/lib/systemd/system/ else echo "已經存在文件跳過" fi systemctl daemon-reload systemctl enable --now httpd num02=$(ps -ef |grep -v 'grep'|grep -c httpd) if [ $num02 -eq 0 ];then echo "httpd自啟失敗" else echo "httpd自啟成功" fi echo "歡迎下次使用" [root@slave02 apache]# chmod +x install_apache.sh [root@slave02 apache]# source install_apache.sh [root@slave02 apache]# source install_apache.sh 歡迎使用此腳本 正在安裝依賴包... 正在編譯安裝apr,請聽聽歌放松放松....... apr以及安裝 apr-util以及安裝 httpd已經安裝 apache is help exists 已經存在文件跳過 httpd自啟成功 歡迎下次使用 [root@slave02 ~]# systemctl status httpd.service ● httpd.service - Start http Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled) Active: active (running) since Sat 2021-09-04 17:45:33 CST; 5h 57min ago Main PID: 834761 (httpd) Tasks: 7 (limit: 5782) Memory: 6.3M CGroup: /system.slice/httpd.service ├─834761 /usr/local/apache/bin/httpd -k start ├─835358 /usr/local/apache/bin/httpd -k start ├─835359 /usr/local/apache/bin/httpd -k start ├─835360 /usr/local/apache/bin/httpd -k start ├─835361 /usr/local/apache/bin/httpd -k start ├─835362 /usr/local/apache/bin/httpd -k start └─836063 /usr/local/apache/bin/httpd -k start [root@slave02 ~]# ss -antl State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 128 *:80 *:* LISTEN 0 128 [::]:22 [::]:*
以上就是入門shell腳本基礎解析的詳細內容,更多關於shell腳本的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- linux shell 編程之函數使用詳解
- shell腳本多實例部署nginx的詳細教程
- nginx七層負載均衡配置詳解
- CentOS 7.9服務器Java部署環境配置的過程詳解
- shell腳本源碼安裝nginx的詳細過程