日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Shell基础语法

發布時間:2024/3/12 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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/bash

Shell入門

1.腳本格式
腳本以

#!/bin/bash開頭(指定解析器) #創建一個shell腳本:helloworld touch helloworld.sh vim helloworld.sh#!/bin/bash echo "helloworld"

2.腳本的常用執行方式
第一種:采用bash或sh+腳本的象對路徑或絕對路徑(不用賦予腳本+x權限),sh+腳本的相對對路徑
在腳本上一層

sh helloworld.sh helloworld# sh+較腳本的絕對路徑 sh /home/dsjprs/shell/helloworld.sh helloworld# bash+腳本的相對路徑 bash helloworld.sh helloworld# bash+腳本的絕對路徑 bash /home/dsjpr/shell/helloworld helloworld

第二種:采用輸入腳本的絕對路徑或腳本的相對路徑執行腳本(必須具有可執行權限)
1.首先要賦予helloworld.sh腳本的+x權限

chmod 777 helloworld.sh # 相對路徑 ./helloworld.sh helloworld# 絕對路徑 /home/dsjprs/shell/helloworld helloworld

注意:

第一種執行的方法。本質是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.txt

Shell變量

shell中的變量:
系統變量
1.常用的系統變量

$HOME $PWD $SHELL $USER

2.實操
查看系統變量

echo $HOME /home/dsjprs# 顯示當前shell中所有變量 set BASH=/bin/bash BASH_ALIASES=() BASH_ARGC=() BASH_ARGV=()

自定義變量
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 $? 0

Shell運算符

運算符基本語法

# 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 notok

Shell流程控制

# 1.if 條件判斷 # 基本語法: if [ 條件判斷 ];then程序 fi # 或者 if [ 條件判斷 ]then 程序 fi

注意事項:
1.[ 條件判斷式 ],中括號和條件判斷式之間必須有空格
2.if后要有空格

實操:
輸入一個數字,如果是1,則輸出banzhang zhen shuai,如果是2,則輸出cls zhen mei ,如果是
其他,則什么都不輸出

touch if.sh vim if.sh#!/bin/bashif [ $1 -eq "1" ]thenecho "banzhang zhen shuai" elif [ $1 -eq "2" ]then echo "cls zhen mei" fichmod 777 if.sh ./if.sh 1 banzhang zhen shuai

case語句:
基本語法:

case $變量名 in "值")如果變量的值等于1,則執行程序1 "值2")如果變量的值等于值2,則執行程序2 :: ...省略其他分支... *) 如果變量的值都不是以上的值,則執行此程序 esac

注意事項:
1.case尾巴=必須為單詞 “in”,每一個模式匹配必須以右括號 “)”結束
2.雙分號 “::”表示命令序列結束,相當于java中的break
3.最后“*)”表示默認模式,相當于java中的default

實操:
輸入一個數字,如果是1,則輸出banzhang,如果式2,則輸出cls,如果是其他,則輸出renyao

touch case.sh vim case.sh#!/bin/bashcase $1 in"1")echo "banzhang" "2")echo "cls" ;; *)echo "renyo" ;; esac chmod 777 case.sh ./case.sh

for 循環:
基本語法:

for ((初始值; 循環條件; 變量變化))do 程序done

實操:
從1加到100

touch for1.sh vim for1.sh#!/bin/bash s=0 for ((i=0;i<100;i++))dos=$[$s+$i]done echo %s chmod 777 for1.sh ./for1.sh "5050"

基本語法2:

for 變量 in 值1 值2 值3...do程序done

實操:
打印所有輸入的參數

touch for2.sh vim for2.sh#!/bin/bash #打印數字 for i in $*doecho "ban zhang love $i"done chmod 777 for2.sh bash for2.sh cls xz bd banzhang love cls banzhang love xz banzhang love bd# 比較$*和$@區別 $*$@都表示傳遞函數或腳本的所有參數,不被雙引號""包含是=時,都以$1 $2 $3 $n touch for.sh vim for.sh#!/bin/bash for i in $*do echo "banzhang love $i"done for j in $@do echo "banzhang love $j"donebash for.sh cls xz bd banzhang love cls banzhang love xz banzhang love bd banzhang love cls banzhang love xz banzhang love bd

當他們都被雙引號"“包含時,”$*" 會將所有的參數作為一個整體,以“$1 2...2...2...n”
的形式輸出所有的參數,“$@”會將各個參數分開,以“$1 2...2...2...n”的形式輸出所有參數

vim for.sh#!/bin/bash for i in "$*" #$*中的所有參數看作是一個整體,所以這個for循環只會循環一次do echo "banzhang love $i"donefor j in "$@" #%@中的每個參數都看成是一個獨立的,所以"$@"中的幾個參數,就會循環幾次doecho "banzhang love $j"done chommod 777 for.shbash for.sh cls xz bd banzhang love cls xz bd banzhang love cls banzhang love xz banzhang love bd

while循環:
基本語法:

while [條件判斷式]do 程序done

實操:
從1加到100

touch while.sh vim while.sh #!/bin/bash s=0 i=1 while [ $i -el 100 ]dos=$[$s+$i]i=$[$i+1]done echo $s chmod 777 while.sh ./while.sh 5050

read讀取控制臺輸入

read讀取控制臺輸入
基本語法
read(選項)(參數)
選項:
-p:指定讀取時的提示符
-t:指定讀取值時等待的時間(秒)

參數
變量:指定讀取值的變量名

實操:
提示7秒內,讀取控制臺輸入的名稱

touch read.sh vim read.sh#!/bin/bash read -t 7 "enter your name in 7 seconds" NAME echo $NAME./read.sh enter your name in 7 seconds xiaozhang xiaozhang

函數:
系統函數:
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 banzhang

dirname基本語法:
dirname文件絕對路徑
(功能描述:從給定的包含的絕對路徑的文件名去掉文件名(非目錄的部分),然后返回剩下的路徑
(目錄的部分))
實操:

# 獲取banzhang.txt 文件的路徑 diename /home/dsjprs/banzhang.txt /home/dsjprs# 自定義函數: # 基本語法 [function] funname[()] {Action;[return int;] } funname

經驗技巧:
不許在調用函數地方之前,先聲明函數,shell腳本是逐行執行,不像其他語言一樣先編譯
函數返回值,只能通過$?系統變量獲得,可以顯示加,return返回,如果不加,將以最后一條命令運行
結果,作為返回值,return后跟數值n(0-255)
實操:

touch fun.sh vim fun.sh #!/bin/bash function sum() {s=0s=$[ $1 + $2 ]echo "$s" } read -p "plase input the number1:" n1; read -p "plase input the number2:" n2; sum $n1 $n2 chmod 777 fun.sh ./fun.sh plase input the number1: 2 plase inout the number2: 5 7

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中空格所在的行號

awk '/^$/{print NR}' sed.txt

有文件chengji.txt內容如下:
張三 40
李四 50
王五 60
使用linux命令計算第二列的和并輸出

cat chengji.txt | awk -F " " '{sum+=$2} END{print sum}'

搜狐 & 和迅網
shell腳本里如何檢查一個文件是否存在?如果不存在該如何處理?

#!/bin/bash if [ -f file.txt]; thenecho "文件存在!" elseecho "文件不存在!" fi

新浪:
使用shell寫一個腳本,對文本無序的一列數字進行排序

cat test.txt 2 3 4 1 6 7 9 8 sort -n test.txt | awk '{a+=$0; print $0} END "SUM="a' 1 2 3 4 5 6 7 8 9

金和網絡:
請用shell腳本寫出查找當前文件夾(/home)下所有的文本文件內容包含有字符 "shen"的文件名稱

grep -r "shen" /home | cut -d ":" -f 1 /home/dsjprs/shell/sed.txt /home/dsjprs/shell/cut/txt

如在文中有所收獲,請點贊👍+關注,傳統美德不能丟🙌


總結

以上是生活随笔為你收集整理的Shell基础语法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。