Shell基础语法
👦博主介紹:程序員悟啦(烏拉~)
?個人倉庫:碼云
🔊座右銘:“懶”對一個人的毀滅性有多大,早起的重要性就多大。
📚免責聲明:文章由博主原創、部分文章整理于網絡,僅供學習和知識分享
💬相遇是緣,既然來了就拎著小板凳🪑坐下來一起嘮會兒👁?🗨,如果在文中有所收獲,請別忘了一鍵三連,動動你發財的小手👍,你的鼓勵,是我創作的動力🤤!
文章目錄
- Shell基礎語法
- Shell概述
- Shell入門
- Shell變量
- Shell運算符
- Shell條件判斷
- Shell流程控制
- read讀取控制臺輸入
- Shell工具(重點)
- 面試題
Shell基礎語法
Shell概述
shell概述:
shell是一個命令行解釋器,它接收應用程序、用戶命令,然后調用操作系統內核,shell還是一個功能強大的編程語言,易編寫,易調試,靈活性強。
linux提供的shell解析器是:
cat /etc/shells /bin/sh /bin/bash /sbin/nologin /bin/dash /bin/tcsh /bin/cshbash和sh關系: sh -> bash# Centos默認的解析器是bash echo $SHELL :/bin/bashShell入門
1.腳本格式
腳本以
2.腳本的常用執行方式
第一種:采用bash或sh+腳本的象對路徑或絕對路徑(不用賦予腳本+x權限),sh+腳本的相對對路徑
在腳本上一層
第二種:采用輸入腳本的絕對路徑或腳本的相對路徑執行腳本(必須具有可執行權限)
1.首先要賦予helloworld.sh腳本的+x權限
注意:
第一種執行的方法。本質是bash解析器幫助執行腳本,所以本身不需要執行權限。
第二種執行方法,本質是腳本需要自己執行,所以需要執行權限
shell腳本命令編寫:多命令進行處理
# 在/home/dsjprs/shell目錄下創建banzhang.txt在banzhang.txt文件中添加”i love cls“ touch banzhang.sh vim banzhang.sh#!/bin/bash cd /home/dsjprs/shelltouch cls.txt echo "i love cls" >> cls.txtShell變量
shell中的變量:
系統變量
1.常用的系統變量
2.實操
查看系統變量
自定義變量
1.基本語法:
定義變量: 變量=值
撤銷變量:unset 變量
聲明靜態變量:readonly 變量,注意,不能unset
2.變量定義規則
變量名稱可以由字母,數字和下劃線組成,但是不能以數字開頭,環境變量名建議大寫等號兩側不能有空格,在bash中,變量默認類型都是字符串類型,無法直接進行數值運算,變量的值如果有空格,需要使用雙引號或單引號括起來
實操:
# 1.定義變量A A=4 echo $A 4# 2.給變量A重新賦值 A=5 echo $A 5# 3.撤銷變量 unset A echo $A# 4.聲明靜態變量B=2,不能unset readonly B=2 echo $B 2# 5.在bash中,變量默認類型都是字符串,無法直接進行數值運算 C=1+2 echo $C 1+2# 6.變量的值如果有空格,需要使用雙贏好或單引號進行括起來 D=I love cls command not foundD="I love cls" echo $D I love cls# 7.可把變量提升為全局環境變量,可供其他的shell程序使用 ecport 變量名 vim helloworld.sh #!/bin/bash echo "helloworld" echo $B ./helloworld helloworld# 發現并沒有打印輸出變量B的值 export B ./helloworld.sh helloworld 2特殊變量:$n
1.基本語法
$n(功能描述:n為數字,$0代表該腳本名稱,$1- 9代表第一個到第九個參數,十以上的參數,需要使用大括號進行括起來,如9代表第一個到第九個參數,十以上的參數,需要使用大括號進行括起來,如9代表第一個到第九個參數,十以上的參數,需要使用大括號進行括起來,如{10} )
實操:
# 輸出該腳本文件名稱,輸入參數1和參數2的值 touch parameter.sh vim parameter.sh #!/bin/bash echo "$0 $1 $2"chmod 777 parameter.sh ./parameter.sh cls banzhang# 特俗變量:$# # 1.基本語法 $# (功能描述:獲取所以參數個數,常用于循環) # 獲取輸入參數的個數 #!/bin/bash echo "$0 $1 $2" echo $# chmod 777 parameter.sh ./parameter.sh cls banzhang 2# 特殊變量:$*, $@ # 1.基本語法 $* (功能描述:這個變量代表命令行中所有的參數,$*把所有的參數看成一個整體) $@ (功能描述:這個表里表示也代表命令行所有的參數,不過$@把每個參數區分對待)實操: # 打印輸入的所有參數 vim parameter.sh#!/bin/bash echo "$0 $1 $2" echo $# echo $* echo $@bash parameter.sh 1 2 3 1 2 3 1 2 3特殊變量:$?
1.基本語法
$? (功能描述:最后一次執行的命令返回值狀態,如果這個變量的值為0,證明上一次命令正確執行
如果這個變量的值非0,(具體那個數,由命令自己決定)則證明上一個命令執行不正確)
實操:
./helloworld.sh helloworldecho $? 0Shell運算符
運算符基本語法
# 1."$((運算式))" 或 "$[運算式]" # .expr + - * / % 加減乘除 取余 # 注意:expr運算符要有空格# 實操: # 1.計算3+2的值 expr 2 + 3 5#2 .計算3 - 2的值 expr 3 - 2 1# 3.計算(2+3)*4的值 a.expr一步完成 expr `expr 2 + 3` \* 4b采用$[運算式]方式 s=$[(2+3)*4]Shell條件判斷
條件判斷基本語法:
[condition] (注意: condition 前后要有空格)
注意:條件判斷非空即為true,[dsjprs] 返回true, [] 返回flase
常用判斷條件
# 1.兩個整數之間比較 = 字符串比較 -lt 小于(less than) -le 小于等于 (less equal) -eq 等于 (equal) -gt 大于 (greater than) -ge 大于等于 (greater equal) -ne 不等于 (not equal)# 2.按照文件權限進行判斷 -r 有讀的權限(read) -w 有寫的權限 (write) -x 有執行的權限 (exceute)# 按照文件類型進行判斷 -f 文件存在并且是一個常規文件 (file) -d 文件存在并且是一個目錄 (directory) -e 文件存在 (existence)# 實操: # 1.23是否大于等于22 [ 23 -ge 22 ] echo $? 0# 2.helloworld.sh是否具有寫權限 [ -w helloworld.sh ] echo $? 0# 3./home/dsjprs/cls.txt [ -e /home/dsjprs/cls.txt ] echo $? 0# 4.多條件判斷(&& 表示前一條命令執行成功時,才執行后一條命令 || 表示上一條命令執行失敗后,才執行下一條命令)[ condition ] && echo ok || echo notok ok[ condition ] && [] || echo notok notokShell流程控制
# 1.if 條件判斷 # 基本語法: if [ 條件判斷 ];then程序 fi # 或者 if [ 條件判斷 ]then 程序 fi注意事項:
1.[ 條件判斷式 ],中括號和條件判斷式之間必須有空格
2.if后要有空格
實操:
輸入一個數字,如果是1,則輸出banzhang zhen shuai,如果是2,則輸出cls zhen mei ,如果是
其他,則什么都不輸出
case語句:
基本語法:
注意事項:
1.case尾巴=必須為單詞 “in”,每一個模式匹配必須以右括號 “)”結束
2.雙分號 “::”表示命令序列結束,相當于java中的break
3.最后“*)”表示默認模式,相當于java中的default
實操:
輸入一個數字,如果是1,則輸出banzhang,如果式2,則輸出cls,如果是其他,則輸出renyao
for 循環:
基本語法:
實操:
從1加到100
基本語法2:
for 變量 in 值1 值2 值3...do程序done實操:
打印所有輸入的參數
當他們都被雙引號"“包含時,”$*" 會將所有的參數作為一個整體,以“$1 2...2...2...n”
的形式輸出所有的參數,“$@”會將各個參數分開,以“$1 2...2...2...n”的形式輸出所有參數
while循環:
基本語法:
實操:
從1加到100
read讀取控制臺輸入
read讀取控制臺輸入
基本語法
read(選項)(參數)
選項:
-p:指定讀取時的提示符
-t:指定讀取值時等待的時間(秒)
參數
變量:指定讀取值的變量名
實操:
提示7秒內,讀取控制臺輸入的名稱
函數:
系統函數:
basename基本語法:
basename [string/pathname] [suffix]
(功能描述:basename 命令會刪掉所以的前綴包括最后一個(’/‘)字符,然后字符串顯示出來)
選項:
suffix為后綴,如果suffix被指定,basename會將pathname或string中的suffix去掉
實操:
截取/home/dsjprs/banzhang.txt路徑的文件名稱 baename /home/dsjprs/banzhang.txt banzhang.txt baename /home/dsjprs/banzhang.txt .txt banzhangdirname基本語法:
dirname文件絕對路徑
(功能描述:從給定的包含的絕對路徑的文件名去掉文件名(非目錄的部分),然后返回剩下的路徑
(目錄的部分))
實操:
經驗技巧:
不許在調用函數地方之前,先聲明函數,shell腳本是逐行執行,不像其他語言一樣先編譯
函數返回值,只能通過$?系統變量獲得,可以顯示加,return返回,如果不加,將以最后一條命令運行
結果,作為返回值,return后跟數值n(0-255)
實操:
Shell工具(重點)
shell工具(重點)
cut 的工作就是“剪”,具體的說就是在文件中負責剪切數據用的。
cut命令從文件的每一行切字節,字符和字段并將這些字節和字符和字段輸出
基本語法:
cut [選項參數] filename
說明:默認分隔符是制表符
選項參數說明:
-f: 序列號,提取第幾列
-d: 分隔符,按照指定分隔符分割列
實操:
touch cut.txt vim cut.txt dong sheng guan zheng wo wo lai lai le le切割cut.txt第一列
cut -d " " -f 1 cut.txt dong guan wo lai le切割cut.txt第二,第三列
cut -d " " -f 2, 3 cut.txt shen zhen wo lai le在cut.txt文件中切割guan
cat cut.txt | grep "guan" | cut -d " " -f 1 guan選取系統PATH 變量值,第二個“:”開始后的所以路徑
echo $PATH /usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/dsjprs/binecho $PATH | cut -d: -f 2- /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/dsjprs/bin切割ifconfig 后打印的IP地址
sed sed是一種流編輯器,它一次處理一行內容,處理時,把當前處理的行存儲在臨時緩沖區 稱為(“模式空間”)接著sed命令處理緩沖區中的內容,處理后,把緩沖區的內容送往屏幕 接著處理下一行,這樣不斷重復,直到文件末尾。 文件內容并沒有改變,除非你使用重定向存儲輸出# 基本語法: sed [選項參數] “command” filename# 選項參數說明: -e: 直接在指令列模式上進行sed的動作編輯# 命令功能的描述 a 新增,a的后面可以接字串,在下一行出現 d 刪除 s 查找并替換# 實操: # 數據準備: touch sed.txt vim sed.txt dong shen guan zhen wo wo lai lai le le# 1.將"mei nv"這個單詞插入到sed.txt第二行,打印 sed '2a mei nv ' sed.txt dong shen guan zhen mei nv wo wo lai lai le lecat sed.txt dong shen guan zhen mei nv wo wo lai lai le le # 注意:文件并沒有改變# 2.刪除sed.txt文件包含的wo的行 sed '/wo/d' sed.txt dong shen guan zhen mei nvlai lai le le# 3.將sed文件中的wo替換為ni sed 's/wo/ni/g' sed.txt dong shen guan zhen ni ni lai lai le le# 注意:'g' 表示global,全部替換# 4.將sed.txt文件中的第二行刪除并將wo替換為ni sed -e '2d' -e 's/wo/ni/g' sed.txt dong shen ni ni lai lai le leawk 一個強大的文件分析工具,將文件逐行的讀入,以空格為默認的分隔符,將分隔符每行切片,切開的部 分再進行分析處理 # 基本語法: awk [選項參數] 'pattern1{action1} pattern2{action2}...' filename pattern:表示 AWK 在數據中查找的內容,就是匹配模式 action:在查找匹配內容時所執行的一系列命令# 選項參數說明 -F: 指定輸入文件折分隔符 -v: 賦值一個用戶自定義變量# 實操: # 數據準備: sudo cp /etc/passwd ./ # 搜索pwasswd文件以root關鍵字開頭的所有行,并輸出該行的第7列 awk -F:'^/root/{print $7} passwd' /bin/bash# 搜索passwd文件以root關鍵字開頭的所有行,并輸出該行的第1列和第7列中間以":"號分割 awk -F:'^/BEGIN{print "user, shell"} {print $1 "," $7} END{print "dahaige, / bin/zuishuai"}' passwduser, shell bin./sbin/nologin dsjprs,/bin/bash dsjprs,/bin/zuishuai # 注意:BEGIN所在數據讀取行之前執行,END在所在數據執行之后執行# 將passwd文件中的用戶id增加數值1并輸出 awk -v i=1 -F: '{print $3+i}' passwd 1 2 3 4# awk的內置變量 FILENAME 文件名 NR 已讀的記錄數 NF 瀏覽記錄的域的個數(切割后,列的個數)# 實操: # 統計passwd文件名,每行的行號,每行的列數 awk -F: '{print "filename:" FILENAME",linenumber:" NR",columns:" NF}' passwd filename:passwd,linenumber:1, columns:7 filename:passwd, linenumber:2, columns:7 filename:passwd, linenumber:3, colmuns:7# 切割ip ifconfig eth0 | grep "inet addr" | awk -F: "{print $2}" | awd -F " " '{print $1}' 192.168.244.121# 查詢sed.txt中空行所在的行號 awk '/^$/{print NR}' sed.txtsort sort命令是在Linux里非常有用,它將文件進行排序,并將排序結果標準輸出# 基本語法: sort(選項)(參數) -n:依照數值的大小排序 -r: 以相反的順序排序 -t: 設置排序時所用的分隔符 -k: 指定需要排序的列 參數:指定待排序的列# 實操: # 數據準備: touch sort.sh vim sort.sh bb:40:5.4 bd:20:3.5 cls:10:3.5 xz:50:2.3 ss:30:1.6 # 按照 ":"分割后的第三列倒序排序 sort -t " -nrk 3 sort.sh bb:40:5.4 bd:20:4.2 cls:10:3.5 xz:50:2.3 ss:30:1.6面試題
京東:
使用linux命令查詢flie1中空格所在的行號
有文件chengji.txt內容如下:
張三 40
李四 50
王五 60
使用linux命令計算第二列的和并輸出
搜狐 & 和迅網
shell腳本里如何檢查一個文件是否存在?如果不存在該如何處理?
新浪:
使用shell寫一個腳本,對文本無序的一列數字進行排序
金和網絡:
請用shell腳本寫出查找當前文件夾(/home)下所有的文本文件內容包含有字符 "shen"的文件名稱
如在文中有所收獲,請點贊👍+關注,傳統美德不能丟🙌
總結
- 上一篇: 编译原理——词法分析(有穷自动机)
- 下一篇: 计算机专业学历简况,刘觉民