linux之shell腳本編寫

1、系統環境變量

對所有用戶有效,如:PATH、PATH、HOME、SHELL、SHELL、PWD等等。

查看PATH信息,命令爲:echo $PATH,即變量前面加$符號

2、shell腳本

①腳本名稱:xx.sh

②腳本第一行內容爲:#!/bin/bash,表示使用shell解釋器

③註釋符號# 放在需註釋內容的前面

④腳本權限,通過ll xx.sh查看腳本權限,如果沒有可執行權限,chmod +x xx.sh添加腳本可執行權限

3、shell腳本執行

①bash xx.sh或./xx.sh或sh xx.sh或bash xx.sh

說明:會新開一個bash,不同bash中的變量無法共享。

②source xx.sh或. xx.sh

說明:在同一個shell裏面執行的。

4、用戶自定義變量

①列出所有變量:set

②刪除變量:unset 變量名

③提升爲系統變量:export 變量名=變量值 或者 export 聲明的變量

④位置參數變量:

$n:n爲數字,0代表命令本身,1之後表示參數,如$1、$9、${10}

$*:將命令中參數當成一個整體輸出

$@:輸出每個參數

$#:參數的個數

$?: 上個命令的退出狀態,或函數的返回值

5、read命令

來源:https://www.runoob.com/linux/linux-comm-read.html
read命令用於從標準輸入讀取數值。
read 內部命令被用來從標準輸入讀取單行數據。這個命令可以用來讀取鍵盤輸入,
當使用重定向的時候,可以讀取文件中的一行數據。

語法:
read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]

參數說明:
-a 後跟一個變量,該變量會被認爲是個數組,然後給其賦值,默認是以空格爲分割符。
-d 後面跟一個標誌符,其實只有其後的第一個字符有用,作爲結束的標誌。
-p 後面跟提示信息,即在輸入前打印提示信息。
-e 在輸入的時候可以使用命令補全功能。
-n 後跟一個數字,定義輸入文本的長度,很實用。
-r 屏蔽\,如果沒有該選項,則\作爲一個轉義字符,有的話 \就是個正常的字符了。
-s 安靜模式,在輸入字符時不再屏幕上顯示,例如login時輸入密碼。
-t 後面跟秒數,定義輸入字符的等待時間。
-u 後面跟fd,從文件描述符中讀入,該文件描述符可以是exec新開啓的。

6、sed命令

來源:https://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html
     https://www.cnblogs.com/tureno/articles/6677942.html

sed是一個很好的文件處理工具,本身是一個管道命令,主要是以行爲單位進行處理,
可以將數據行進行替換、刪除、新增、選取等特定工作,下面先了解一下sed的用法
sed命令行格式爲:
sed [-nefri] ‘command’ 輸入文本        

常用選項:
-n ∶使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN的資料一般都會被列出到螢幕上。
    但如果加上 -n 參數後,則只有經過sed 特殊處理的那一行(或者動作)纔會被列出來。
-e ∶直接在指令列模式上進行 sed 的動作編輯;
-f ∶直接將 sed 的動作寫在一個檔案內, -f filename 則可以執行 filename 內的sed 動作;
-r ∶sed 的動作支援的是延伸型正規表示法的語法。(預設是基礎正規表示法語法)
-i ∶直接修改讀取的檔案內容,而不是由螢幕輸出。       

常用命令:
a ∶新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
c ∶取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
d ∶刪除,因爲是刪除啊,所以 d 後面通常不接任何咚咚;
i ∶插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
p ∶列印,亦即將某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作~
s ∶取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!

7、判斷參數

1)文件測試語句

【參數說明】

-d:測試文件是否爲目錄類型

-e:測試文件是否存在

 -f:判斷是否爲一般文件

 -r:測試當前用戶是否有權限讀取

-w:測試當前用戶是否有權限寫入

-x:測試當前用戶是否有權限執行

【示例】

[ -d /etc/fstab ]

[ -f /etc/fstab ]

2)邏輯測試語句:&& || !

【示例】

[ $USER != root ] && echo "user" || echo "root"

3)整數值語句

【參數說明】

-eq:是否等於

-ne:是否不等於

 -gt:是否大於

-lt:是否小於

-le:是否等於或小於

-ge:是否大於或等於

【示例】

[ 10 -gt 10 ]

4)字符串比較語句

= :比較字符串內容是否相同

!=:比較字符串內容是否不同

-z:判斷字符串內容是否爲空

【示例】

[ $LANG != "en.US" ] && echo "not en.US"

8、循環控制語句

// 提醒:[]符號記得空格

// if格式
if [ 條件 ] ;then
  // 業務處理
 elif [ 條件 ] ;then
  // 業務處理
 else
  // 業務處理
fi


// for格式
for 變量名 in 取值列表
do
 // 業務處理
done


// while格式
while 條件
do
 // 業務處理
done


// case格式
case 變量值 in
模式1)
 // 業務處理
 ;;
模式2)
 // 業務處理
 ;;
模式n)
 // 業務處理
 ;;
*)
 // 業務處理
esac

9、shell腳本分析(以下是nginx的shell腳本)

#!/bin/bash
# nginx - this script starts and stops the nginx daemon
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /usr/local/nginx/conf/nginx.conf
# pidfile: /usr/local/nginx/logs/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/local/nginx/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx

make_dirs() {
# make required directories
user=`$nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
        if [ -z "`grep $user /etc/passwd`" ]; then
                useradd -M -s /bin/nologin $user
        fi
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
        if [ `echo $opt | grep '.*-temp-path'` ]; then
                value=`echo $opt | cut -d "=" -f 2`
                if [ ! -d "$value" ]; then
                        # echo "creating" $value
                        mkdir -p $value && chown -R $user $value
                fi
        fi
done
}

start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}

stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}

restart() {
#configtest || return $?
stop
sleep 1
start
}

reload() {
#configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}

force_reload() {
restart
}

configtest() {
$nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
status $prog
}

rh_status_q() {
rh_status >/dev/null 2>&1
}

case "$1" in
start)
        rh_status_q && exit 0
        $1
        ;;
stop)
        rh_status_q || exit 0
        $1
        ;;
restart|configtest)
$1
;;
reload)
        rh_status_q || exit 7
        $1
        ;;
force-reload)
        force_reload
        ;;
status)
        rh_status
        ;;
condrestart|try-restart)
        rh_status_q || exit 0
        ;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
【腳本說明】
第11、13行:執行shell腳本
第15行:判斷$NETWORKING的值,如果是no,則退出
第19行:首先判斷是否是文件,如果是執行後面的腳本文件
第22~38行:make_dirs函數
|--第24行:獲取用戶
|--第25行:判斷是否爲空
|--第26行:添加不能登陸的用戶 且 不要自動建立用戶的登陸目錄
|--第29~37行:for語句
  |--第31行:用=號作爲分隔符,選取其第2個字段
  |--第32行:判斷是否爲文件夾
  |--第34行:批量創建文件 並且 給文件添加用戶
第40~50行:start函數
|--第41行:當前用戶是否有權限執行,否則,退出
|--第42行:判斷是否爲文件,否則,退出
|--第43行:調用make_dirs函數
|--第46行:判斷上一條命令是否執行成功
|--第48行:判斷是否等於0 且 創建文件
第52~59行:stop函數
第61~66行:restart函數
第68~74行:reload函數
第76~78行:force_reload函數
第80~82行:configtest函數
|--第81行:檢查配置文件是否正確
第84~86行:rh_status函數
第88~90行:rh_status_q函數
|--第89行:標準輸出和錯誤輸出都進了“黑洞”
第92~120行:case語句,根據條件判斷,調用不同的函數

參考:
https://blog.csdn.net/helloxiaozhe/article/details/80596138
https://blog.csdn.net/longgeaisisi/article/details/90519690
https://www.linuxprobe.com/chapter-20.html#2022_Nginx
https://www.cnblogs.com/irisrain/p/4324593.html

 

參考:

https://www.cnblogs.com/zhangchao162/p/9614145.html

https://blog.csdn.net/zhoulv2000/article/details/14160935

https://www.linuxprobe.com/chapter-04.html#42_Shell

https://blog.csdn.net/u010622613/article/details/80706119

https://blog.csdn.net/xdmaidou/article/details/80670965

https://blog.csdn.net/qq_35744460/article/details/89702566

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章