Shell腳本這是Shell腳本的語法知識。認識shell什么是shellShell 是命令解釋器,用于解釋用戶對操作系統的操作。 復制代碼 隱藏代碼cat /etc/shells //查看shell類型Linux 的 Shell ...
這是Shell腳本的語法知識。
Shell 是命令解釋器,用于解釋用戶對操作系統的操作。
復制代碼 隱藏代碼cat /etc/shells //查看shell類型
Linux 的 Shell 種類眾多,常見的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
BIOS - MBR - BootLoader(grub) - kernel - init或systemd - 系統初始化 - shell
UNIX 的哲學:一條命令只做一件事
demo.sh
復制代碼 隱藏代碼#!/bin/bash # demo 注釋cd /data/ lspwd
#!
是一個約定的標記(Sha-Bang),它告訴系統這個腳本需要什么解釋器來執行。
復制代碼 隱藏代碼chmod u+rx demo.sh //賦權 //子進程執行,不會改變當前環境 bash demo.sh //可不需可執行權限 ./demo.sh //必須可執行權限 //當前進程執行,會改變當前環境source ./demo.sh . filename.sh
內建命令不需要創建子進程
內建命令對當前 Shell 生效
匿名管道(管道符)|
是 Shell 編程經常用到的通信工具,將前一個命令執行的結果傳遞給后面的命令。
例如:
復制代碼 隱藏代碼ls -l | more more filename cat filename | more //分頁顯示文件內容
管道符會將兩側命令(外建命令)建兩個子進程,如果是內建命令,子進程的修改,不會傳遞到父進程。
外部命令會產生子進程,管道符同樣會產生子進程。內部命令在shell當前進程運行,不會產生子進程。
在管道符兩端放置內部命令,相當于打開了新的子shell。內部命令執行結束之后,子shell也會跟著一起結束。因此在管道符兩端放置內部命令,對當前的shell是不生效的。
一個進程默認會打開標準輸入、標準輸出、錯誤輸出三個文件描述符。
默認的標準輸入是鍵盤,默認的標準輸出是屏幕,默認的錯誤輸出是屏幕,而改變這個行為就是重定向。
< 輸入重定向
\> 輸出重定向
\>> 追加重定向
2> 錯誤重定向
&> 全部重定向
| 管道重定向
&1 引用重定向
由于引用重定向“&1”的存在,會使得下面幾個命令等價:
command > file 2> file(要打開兩次file,效率較低)
command 2> file > file(要打開兩次file,效率較低)
command > file 2> &1(只打開一次file,效率較高)
command 2> file > &1(只打開一次file,效率較高)
command &> file (只打開一次file,效率最高)
變量名的命名規則
字母、數字、下劃線
不以數字開頭
復制代碼 隱藏代碼a=123 //等號左右側不能有空格,有空格會被認為是命令let a=10+20 //let賦值,可計算 l=ls //將命令賦值給變量 string="hello bash" //將字符串賦值給變量 c=$(ls-l /etc) //將命令結果賦值給變量 c='ls-l /etc' //將命令結果賦值給變量
空格等特殊字符可以包含在""
或''
中
${變量名} 為變量的引用
echo ${變量名} 查看變量值,部分情況可省略為$變量名
默認作用范圍為當前終端,不跨子父終端。
export 導出,使子進程可以訪問父進程變量
復制代碼 隱藏代碼export demo_string
unset 刪除
復制代碼 隱藏代碼unset demo_string
環境變量:每一個終端都可以獲得的變量
env 查看環境變量
set 查看更多環境變量
復制代碼 隱藏代碼echo $PATH //當前終端的搜索路徑echo $PS1 //當前終端的提示信息echo $? //查看上一條命令是否正確執行echo $! //echo $$ //顯示當前進程的pidecho $0 //顯示當前進程名稱
位置參數
$1$2 $3 ....${10}
${2-_}
//如果第二個參數無值,則結果為_
配置文件
/etc下保存全部用戶配置
~/下保存對應用戶配置
login用戶使用四個配置,no-login使用bashrc
/etc/profile
/etc/bashrc
~/.bashrc
~/.bash_profile
/etc/profile.d/
login 模式下加載順序為 /etc/profile ~/.bash_profile ~/.bashrc /etc/bashrc
no-login 模式下加載順序為 ~/.bashrc /etc/bashrc
定義數組
復制代碼 隱藏代碼IPTS=(112 324 112 54 2544)
顯示數組全部元素
復制代碼 隱藏代碼echo ${IPTS[@]}echo ${IPTS}
顯示數字元素個數
復制代碼 隱藏代碼echo ${#IPTS[@]}echo ${#IPTS}
顯示第n個元素
復制代碼 隱藏代碼echo ${IPTV[N]}
一個字符不僅有字面意義,還有元意(meta-meaning)
#
注釋
;
分號
\
轉義符號
\n
\r
\t
單個字母的轉義\$
\”
\\
單個非字母的轉義
"
和'
引號
賦值運算符=
用于算數賦值和字符串賦值
算數運算符+
-
*
/
**
%
復制代碼 隱藏代碼c=`expr 4 + 5` //反引號
數字常量
let “變量名 = 變量值”
變量值使用 0 開頭為八進制
變量值使用 0x 開頭為十六進制
雙圓括號
雙圓括號是 let 命令的簡化(( a = 10 ))
(( a++ ))
echo $((10+20))
復制代碼 隱藏代碼test expression
當 test 判斷 expression 成立時,退出狀態為 0,否則為非 0 值。
test 命令也可以簡寫為[]:
復制代碼 隱藏代碼[ expression ]
注:[]和expression之間的空格,這兩個空格是必須的,否則會導致語法錯誤。
文件類型判斷
復制代碼 隱藏代碼-b filename 判斷文件是否存在,并且是否為塊設備文件。-c filename 判斷文件是否存在,并且是否為字符設備文件。-d filename 判斷文件是否存在,并且是否為目錄文件。-e filename 判斷文件是否存在。-f filename 判斷文件是否存在,井且是否為普通文件。-L filename 判斷文件是否存在,并且是否為符號鏈接文件。-p filename 判斷文件是否存在,并且是否為管道文件。-s filename 判斷文件是否存在,并且是否為非空。-S filename 判斷該文件是否存在,并且是否為套接字文件。
文件權限判斷
復制代碼 隱藏代碼-r filename 判斷文件是否存在,并且是否擁有讀權限。-w filename 判斷文件是否存在,并且是否擁有寫權限。-x filename 判斷文件是否存在,并且是否擁有執行權限。-u filename 判斷文件是否存在,并且是否擁有 SUID 權限。-g filename 判斷文件是否存在,并且是否擁有 SGID 權限。-k filename 判斷該文件是否存在,并且是否擁有 SBIT 權限。
文件比較
復制代碼 隱藏代碼filename1 -nt filename2 判斷 filename1 的修改時間是否比 filename2 的新。filename1 -ot filename2 判斷 filename1 的修改時間是否比 filename2 的舊。filename1 -ef filename2 判斷 filename1 是否和 filename2 的 inode 號一致。
數值比較
復制代碼 隱藏代碼num1 -eq num2 判斷 num1 是否和 num2 相等。num1 -ne num2 判斷 num1 是否和 num2 不相等。num1 -gt num2 判斷 num1 是否大于 num2。num1 -lt num2 判斷 num1 是否小于 num2。num1 -ge num2 判斷 num1 是否大于等于 num2。num1 -le num2 判斷 num1 是否小于等于 num2。
字符串比較
復制代碼 隱藏代碼-z str 判斷字符串 str 是否為空。 -n str 判斷宇符串 str 是否為非空。 str1 = str2 str1 == str2 =和==是等價的,都用來判斷 str1 是否和 str2 相等。 str1 != str2 判斷 str1 是否和 str2 不相等。 str1 \> str2 判斷 str1 是否大于 str2。\>是>的轉義字符,這樣寫是為了防止>被誤認為成重定向運算符。 str1 \< str2 判斷 str1 是否小于 str2。同樣,\<也是轉義字符。
邏輯判斷
復制代碼 隱藏代碼expression1 -a expression 邏輯與,表達式 expression1 和 expression2 都成立,最終的結果才是成立的。 expression1 -o expression2 邏輯或,表達式 expression1 和 expression2 有一個成立,最終的結果就成立。 !expression 邏輯非,對 expression 進行取反。
注:當你在 test 命令中使用變量時,我強烈建議將變量用雙引號""包圍起來
復制代碼 隱藏代碼if conditionthen command1 command2 ... commandNelse commandfi
復制代碼 隱藏代碼case 值 in模式1) command1 command2 ... commandN ;; 模式2) command1 command2 ... commandN ;;esac
復制代碼 隱藏代碼for var in item1 item2 ... itemNdo command1 command2 ... if condition then break fi commandNdone
復制代碼 隱藏代碼while conditiondo command if condition then continue fidone
復制代碼 隱藏代碼until conditiondo commanddone
復制代碼 隱藏代碼funname(){ local var //局部變量 action; echo $1 $2 $3 … $n //參數 [return int] } funname 1 2 3
復制代碼 隱藏代碼#!/bin/bash# signal demotrap "echo sig 15" 15trap "echo sig 2" 2echo $$while :do :done
kill 默認發送15號信號;
ctrl + c 默認發送2號信號;
利用trap信號捕獲,可以防止腳本被kill(除了用kill -9以外)
系統自建函數庫
復制代碼 隱藏代碼/etc/init.d/functions
使用 source 函數腳本文件“導入”函數
一次性計劃任務 at
復制代碼 隱藏代碼at 18:12 //在18:12執行 atq //查看一次性任務
周期性計劃任務 cron
復制代碼 隱藏代碼crontab -e //配置任務 crontab -l //查看任務 min hour data mon week //配置格式
注:命令的路徑問題
計劃任務加鎖
復制代碼 隱藏代碼anacontab 延時計劃任務 flock 鎖文件
鏈接地址:https://www.52pojie.cn/thread-1822001-1-1.html
來源:本文內容搜集或轉自各大網絡平臺,并已注明來源、出處,如果轉載侵犯您的版權或非授權發布,請聯系小編,我們會及時審核處理。
聲明:江蘇教育黃頁對文中觀點保持中立,對所包含內容的準確性、可靠性或者完整性不提供任何明示或暗示的保證,不對文章觀點負責,僅作分享之用,文章版權及插圖屬于原作者。
Copyright?2013-2024 JSedu114 All Rights Reserved. 江蘇教育信息綜合發布查詢平臺保留所有權利
蘇公網安備32010402000125
蘇ICP備14051488號-3技術支持:南京博盛藍睿網絡科技有限公司
南京思必達教育科技有限公司版權所有 百度統計