Linux下的shell命令筆記

shell

Shell 是一種腳本語(yǔ)言,不同于 C/C++、Pascal、Go語(yǔ)言、匯編等,必須在程序運(yùn)行之前將所有代碼都翻譯成二進(jìn)制形式,也就是生成可執(zhí)行文件,用戶(hù)拿到的是最終生成的可執(zhí)行文件,看不到源碼。
這個(gè)過(guò)程叫做編譯(Compile),這樣的編程語(yǔ)言叫做編譯型語(yǔ)言,完成編譯過(guò)程的軟件叫做編譯器(Compiler)。而 Shell、JavaScript、Python、PHP等,需要一邊執(zhí)行一邊翻譯,不會(huì)生成任何可執(zhí)行文件,用戶(hù)必須拿到源碼才能運(yùn)行程序。程序運(yùn)行后會(huì)即時(shí)翻譯,翻譯完一部分執(zhí)行一部分,不用等到所有代碼都翻譯完。
這個(gè)過(guò)程叫做解釋?zhuān)@樣的編程語(yǔ)言叫做解釋型語(yǔ)言或者腳本語(yǔ)言(Script),完成解釋過(guò)程的軟件叫做解釋器。
編譯型語(yǔ)言的優(yōu)點(diǎn)是執(zhí)行速度快、對(duì)硬件要求低、保密性好,適合開(kāi)發(fā)操作系統(tǒng)、大型應(yīng)用程序、數(shù)據(jù)庫(kù)等。
腳本語(yǔ)言的優(yōu)點(diǎn)是使用靈活、部署容易、跨平臺(tái)性好,非常適合 Web 開(kāi)發(fā)以及小工具的制作。
Shell 就是一種腳本語(yǔ)言,我們編寫(xiě)完源碼后不用編譯,直接運(yùn)行源碼即可。

筆錄

shell腳本第一行必須以 #!開(kāi)頭,它表示該腳本使用后面的解釋器解釋執(zhí)行
介紹下常用的linux命令

  • 創(chuàng)建文件touch命令:touch 文件名
touch  01.sh
  • 查看文件里面的內(nèi)容cat
cat  01.sh
  • 變更文件權(quán)限chmod
chmod 777 01.sh
  • 查看文件夾下的所有內(nèi)容ls
ls //查看所有文件
ls -al //查看所有文件,并且顯示文件權(quán)限信息等相關(guān)信息
vim  01.sh //打開(kāi)一個(gè)文件

然后點(diǎn)擊鍵盤(pán)的insert按鍵,進(jìn)入編輯模式
退出按ESC,然后再按Shift+;
最后輸入wq 保存退出

  • echo 輸出內(nèi)容
echo "linux"

shell的if條件語(yǔ)句

#!/bin/bash 類(lèi)似引入頭文件,必須引用

  • 02.sh腳本代碼:
#!/bin/bash
myDir=/usr/bin    #myDir就是一個(gè)定義的變量

if [ -w $myDir ] && [ -d $HOME ]
then
        touch test6
        echo "dir is exist"
        cd $myDir
else
        echo "dir is not exist"
fi      #fi 表示結(jié)束條件語(yǔ)句

上面的腳本:判斷/usr/bin是否可寫(xiě),并且是判斷home目錄是存在,存在創(chuàng)建test6
關(guān)于代碼中的-w和-d 以及相關(guān)命令:
-d 檢查是否存在,并且是一個(gè)目錄
-e 檢查file是否存在
-f 檢查是否存在,并且是一個(gè)文件
-r 檢查是否存在 可讀
-w 檢查文件是否可寫(xiě)
-x 是否可執(zhí)行

  • 執(zhí)行
./02.sh

./ 跟上腳本文件,就可以直接執(zhí)行

  • 結(jié)果


    image.png

case in語(yǔ)句

case in語(yǔ)句 相當(dāng)于Java的switch語(yǔ)句

  • 腳本03.sh 文件
#!/bin/bash
testUser=$1
case $testUser in
rose)
        echo "jason";;
david)
        echo "david";;
*)
        echo "not user";;
esac

上面腳本表示傳入的參數(shù)是否匹配到case中的字符串,有打印相應(yīng)的,沒(méi)有打出默認(rèn)“not user”

*) 表示默認(rèn)的條件,相遇Java的switch中的default
;; 這兩個(gè)連續(xù)的分號(hào)不能漏,語(yǔ)法要求

  • 執(zhí)行:代碼中的$1 表示的是像腳本傳參數(shù),如下:rose就是傳的參數(shù)
./03.sh rose
  • 結(jié)果


    image.png

for語(yǔ)句

  • 01.sh代碼:
#!/bin/bash
echo "參數(shù) $1"
echo "參數(shù) $2"
echo "參數(shù)長(zhǎng)度$#"
for param in "$@"
do
    echo "param:$param"
done    #done 表示結(jié)束循環(huán)

上面的代碼根據(jù)傳入的參數(shù)進(jìn)行遍歷輸出

  1. $1$2 根據(jù)傳入的順序獲取,以此類(lèi)推,$1到N
  2. $# 表示的是參數(shù)的數(shù)量
  3. $@ 表示的是所有參數(shù)的集合
  • 執(zhí)行
./01.sh  11  22   # 11和22 分別對(duì)應(yīng)$1 和$2
  • 結(jié)果


    for語(yǔ)句.png

數(shù)組

  • 默認(rèn)的空格分隔定義
    腳本文件中數(shù)組的表示list="Mother Father Brother" 中間采用空格分開(kāi),linux系統(tǒng)默認(rèn)識(shí)別空格為分隔符
#!/bin/bash
list="Mother Father Brother"
for item in $list
do
        echo $item
done
  • 采用分隔符定義
#!/bin/bash
list="Mother,Father,Brother"
IFS=$,
for item in $list
do
    echo $item
done

將IFS設(shè)置為逗號(hào),便于做list的分隔符
執(zhí)行:./04.sh
輸出:


image.png

while 語(yǔ)句

while語(yǔ)句類(lèi)似Java的while

#!/bin/bash
a=10
while [ $a -gt 0 ]
do
    a=$[ $a - 1]
    echo "a:$a"
    if [ $a -eq 5 ]
    then
    echo "跳出循環(huán)"
    break
    fi

done

break 左右是跳出循環(huán)

運(yùn)算符 說(shuō)明
-eq 檢測(cè)兩個(gè)數(shù)是否相等,相等返回 true。
-ne 檢測(cè)兩個(gè)數(shù)是否不相等,不相等返回 true。
-gt 檢測(cè)左邊的數(shù)是否大于右邊的,如果是,則返回 true。
-lt 檢測(cè)左邊的數(shù)是否小于右邊的,如果是,則返回 true。
-ge 檢測(cè)左邊的數(shù)是否大于等于右邊的,如果是,則返回 true。
-le 檢測(cè)左邊的數(shù)是否小于等于右邊的,如果是,則返回 true。

執(zhí)行: ./05.sh
結(jié)果:


image.png

grep 查找命令

  • 06.sh 腳本代碼:
#!/bin/bash
file=test6
testUser=jason
if grep $testUser /etc/passwd
then
    echo "ok"
fi

上面代碼中:
$testUser 查找的內(nèi)容
/etc/passwd 文件的路徑 文件內(nèi)容里面去找

執(zhí)行:./06.sh
結(jié)果:


image.png

在當(dāng)前例子中使用到 grep查找命令, 如:grep -n bin 01.sh
常用的 grep 選項(xiàng)有:
-c 只輸出匹配行的個(gè)數(shù)。
-i 不區(qū)分大小寫(xiě)(只適用于單字符)。
-h 查詢(xún)多文件時(shí)不顯示文件名。
-l 查詢(xún)多文件時(shí)只輸出包含匹配字符的文件名。
-n 顯示匹配行及行號(hào)。
-s 不顯示不存在或無(wú)匹配文本的錯(cuò)誤信息。
-v 顯示不包含匹配文本的所有行。
-V 顯示軟件版本信息
使用grep匹配時(shí)最好用雙引號(hào)引起來(lái),防止被系統(tǒng)誤認(rèn)為參數(shù)或者特殊命令,也可以匹配多個(gè)單詞。
關(guān)于匹配的實(shí)例:
grep -c "48" test.txt 統(tǒng)計(jì)所有以“48”字符開(kāi)頭的行有多少
grep -i "May" test.txt 不區(qū)分大小寫(xiě)查找“May”所有的行)
grep -n "48" test.txt 顯示行號(hào);顯示匹配字符“48”的行及行號(hào),相同于 nl test.txt |grep 48)
grep -v "48" test.txt 顯示輸出沒(méi)有字符“48”所有的行)
grep "471" test.txt 顯示輸出字符“471”所在的行)
grep "48;" test.txt 顯示輸出以字符“48”開(kāi)頭,并在字符“48”后是一個(gè)tab鍵所在的行
grep "48[34]" test.txt 顯示輸出以字符“48”開(kāi)頭,第三個(gè)字符是“3”或是“4”的所有的行)
grep "[48]" test.txt 顯示輸出行首不是字符“48”的行)
grep "[Mm]ay" test.txt 設(shè)置大小寫(xiě)查找:顯示輸出第一個(gè)字符以“M”或“m”開(kāi)頭,以字符“ay”結(jié)束的行)
grep "K…D" test.txt 顯示輸出第一個(gè)字符是“K”,第二、三、四是任意字符,第五個(gè)字符是“D”所在的行)
grep "[A-Z][9]D" test.txt 顯示輸出第一個(gè)字符的范圍是“A-D”,第二個(gè)字符是“9”,第三個(gè)字符的是“D”的所有的行
grep "[35]..1998" test.txt 顯示第一個(gè)字符是3或5,第二三個(gè)字符是任意,以1998結(jié)尾的所有行
grep "4{2,}" test.txt 模式出現(xiàn)幾率查找:顯示輸出字符“4”至少重復(fù)出現(xiàn)兩次的所有行
grep "9{3,}" test.txt 模式出現(xiàn)幾率查找:顯示輸出字符“9”至少重復(fù)出現(xiàn)三次的所有行
grep "9{2,3}" test.txt 模式出現(xiàn)幾率查找:顯示輸出字符“9”重復(fù)出現(xiàn)的次數(shù)在一定范圍內(nèi),重復(fù)出現(xiàn)2次或3次所有行
grep -n "^$" test.txt 顯示輸出空行的行號(hào)
ls -l |grep "^d" 如果要查詢(xún)目錄列表中的目錄 同:ls -d *
ls -l |grep "^d[d]" 在一個(gè)目錄中查詢(xún)不包含目錄的所有文件
ls -l |grpe "^d…..x..x" 查詢(xún)其他用戶(hù)和用戶(hù)組成員有可執(zhí)行權(quán)限的目錄集合

輸出到文件中

#!/bin/bash
file=test6
echo "david">$file
echo "tim">>$file

執(zhí)行完代碼之后會(huì)找到test6的文件,打開(kāi)可以看到

david
tim

結(jié)束

暫時(shí)先將筆記做到這邊,后續(xù)有新的再來(lái)更新,如果上面的有錯(cuò)誤,歡迎指出。

參考

https://www.runoob.com/linux/linux-shell.html
http://c.biancheng.net/view/2767.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容