abd shell关闭所有程序_一个 Shell 脚本逆袭的规范,拿走不谢
指定一個默認腳本解釋器
“#!” 是一個約定的標記,它告訴系統這個腳本需要什么解釋器來執行,即使用哪一種Shell。他指明了當我們沒有指定解釋器的時候默認的解釋器。
為什么建議要在首行加上腳本默認解釋器,因為有的操作系統的默認解釋器不是sh或者bash,比如SUSE Linux默認的是csh,不能通過 ./ 的方式執行bash或sh腳本。
我們常用sh和bash,這兩種是最受歡迎的shell,腳本中寫一種即可。如:
#!/bin/bash我們可以用下面的命令查看本機支持的解釋器
$?cat?/etc/shells/bin/sh/bin/bash/sbin/nologin/bin/tcsh/bin/csh/bin/dash添加腳本描述信息
在腳本的前面建議加上腳本描述信息,這樣方便查看腳本的信息和有利于腳本的維護工作。
一般的描述信息有:
- 腳本的寫作時間,作者,版權等
- 腳本的用途
- 腳本的注意事項
腳本文件命名有規范
- 腳本文件后綴用.sh,方便識別文件為shell腳本.
- 腳本名稱可以根據執行頻率、用途、業務分類等在名稱中加入些關鍵字,可以讓人顧名思義,對腳本有個認知,如:
如啟動腳本:start_all.sh stop_all.sh start_tomcat.sh stop_tomcat.sh
如業務用途腳本:ods_tablename_daliy.sh, dw_tablename_monthly.sh
變量命名有規范
變量的基本命名法則:
- 統一用小寫字母命名,如 DATE="20210101"
- 由詞組組成的變量名與函數名用下劃線連將詞組連接,如 start_date="20210101",function_name()
- 過長的變量名可以用駝峰命名法命名
shell日志與回顯
在開發過程中,寫好業務代碼的重要性不言而喻,同樣的做好日志記錄要非常重要,通過看日志,能夠幫我們解決很多問題。
下面是一些日志要注意的信息:
1、 一些DEBUG級別的日志在腳本調試結束后需要關閉。
2、 日志輸出要帶時間
3、日志的輸出推薦使用tee -a ${log_file}的方式,可以直接在main函數入口處添加日志輸出
logfile="/var/log/debug.log"# define functionsfunction foo(){ echo "foo"}function oo(){ echo "oo"}# define main functionfunction main(){ echo "START DATE:" $(date +"%Y-%m-%d %H:%M:%S") foo oo echo "FINISH DATE:" $(date +"%Y-%m-%d %H:%M:%S")}# invoke main functionmain|tee -a ${logfile}標準輸出重定向到log文件中,標準錯誤打印在屏幕上
$ sh start_all.sh > /data/logs/hadoop/debug.logshell 錯誤輸出重定向到標準輸出
$ sh start_all.sh > /data/logs/hadoop/debug.log 2>&1標準輸出和標準錯誤重定向到不同log文件中
$ sh start_all.sh 1>log.log 2>err.log使用$()給變量賦值
盡量使用$()將命令的結果賦給變量,而不是用反引號
input_dir=/home/hadoopfiles=$(ls?${input_dir})for file in ${files};do echo ${file}done;shell變量引用
很多人喜歡直接用$號加變量名引用該變量,建議使用${變量名}來引用變量,這樣不容易出錯和混淆。
date="20200101"logfile="/data/logs/hadoop/${date}/debug.log"echo ${logfile}對比
date="20200101"logfile="/data/logs/hadoop/$date/debug.log"echo?$logfileshell腳本的執行方式
腳本的執行方式有好幾種,但是還是建議用腳本解釋器來執行腳本。
強烈推薦,用血的教訓總結。我們的調度工具在升級后,會修改其工作目錄下的所有文件的權限變成只有只讀權限 (400),導致升級后所有用./執行的腳本全部不能執行。
$ sh start_all.sh腳本的執行方式有以下幾種:
1、工作目錄執行
工作目錄執行,指的是執行腳本時,先進入到腳本所在的目錄(此時,稱為工作目錄),然后使用 ./腳本方式執行。前提是腳本有可執行的權限,如果沒有會報沒有權限錯誤。
$??./start_all.sh在沒有執行權限時要先加執行權限$ chmod?+x?./start_all.sh$?./start_all.sh2、絕對路徑執行
絕對路徑中執行,指的是直接從根目錄/到腳本目錄的絕對路徑。前提是腳本有可執行的權限,否則會報沒有權限錯誤。
$?/home/hadoop/start_all.sh3、sh執行
sh執行,指的是用腳本對應的sh或bash來接著腳本執行
$ sh?start_all.sh注意,若是以方法三的方式來執行,那么,可以不必事先設定shell腳本的執行權限,甚至都不用寫shell文件中的第一行(指定bash路徑)。因為方法三是將start_all.sh作為參數傳給sh(bash)命令來執行的。這時不是start_all.sh自己來執行,而是被人家調用執行,所以不要執行權限。
4、shell環境執行
shell環境執行,指的是在當前的shell環境中執行,可以使用 . 接腳本 或 source 接腳本
$ . start_all.sh或$?source?start_all.shshell要有異常處理
要判斷一段代碼是否出現了異常,一個最基本的判斷就是對他返回值的判斷。在shell中,我們往往規定0為正常,一切非0返回值則為不正常。但往往我們在寫shell腳本的時候,忽略對于返回值的判斷。我們看一個很基本的shell程序。
$?這個常量代表的就是上一段shell的返回值,看下面的例子:
#!/bin/shcd /home/xxxx/if [ "$?"= "0" ]; then rm -rf *else echo "cannot change directory" 1>&2 exit 1fi總結
以上是生活随笔為你收集整理的abd shell关闭所有程序_一个 Shell 脚本逆袭的规范,拿走不谢的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hql中获取前一天的数据_Postgre
- 下一篇: unity 是厘米还是米_1种“竹节参”