Shell 基本用法

介紹

Shell的作用是解釋執行用戶的命令,用戶輸入一條命令,Shell就解釋執行一條,這種方式成爲交互式(Interactive)。Shell還有一種執行命令的方式稱爲批處理(Batch),即用戶事先寫一個Shell腳本(Script),其中有很多條命令,讓Shell一次把這些命令執行完,而不必一條一條地敲命令。Shell腳本和編程語言很相似,也有變量和流程控制語句,但Shell腳本是解釋執行的,不需要編譯。

 

用戶在命令行輸入命令後,一般情況下Shell會fork並exec該命令,但是Shell的內建命令例外,執行內建命令相當於調用Shell進程中的一個函數,並不創建新的進程。以前學過的cd、alias、umask、exit等命令即是內建命令,凡是用which命令查不到程序文件所在位置的命令都是內建命令,內建命令沒有單獨的man手冊,要在man手冊中查看內建命令,應該

$ man bash-builtins

如export、shift、if、eval、[、for、while等等。內建命令雖然不創建新的進程,但也會有Exit Status,通常也用0表示成功非零表示失敗,雖然內建命令不創建新的進程,但執行結束後也會有一個狀態碼,也可以用特殊變量$? 讀出。

  • $? 就是返回上一個程序的返回值,0表成功,非0表失敗
    在這裏插入圖片描述

 
在這裏插入圖片描述

  • 加括號 表明,我傳給子進程,而不傳給父進程。這個執行結果是獨立的(作用於子進程,而不傳給父進程,當子進程結束的時候,就會釋放。不會傳遞給shell本身)
    去掉括號 表明,操作會傳給父進程
    在這裏插入圖片描述
     

執行腳本

Shell腳本中用#表示註釋,但如果#位於第一行開頭,並且是#!則例外,它表示該腳本使用後面指定的解釋器/bin/sh解釋執行。

vim t1.sh

#! /bin/sh
cd ..
ls

權限不足的 兩種執行方式 (ls -l 查看權限)

第一種: /bin/sh t1.sh
第二種: chmod a+x t1.sh    ./t1.sh

執行過程:
Shell會fork一個子進程並調用exec執行./script.sh這個程序,exec系統調用應該把子進程的代碼段替換成./script.sh程序的代碼段,並從它的_start開始執行。然而script.sh是個文本文件,根 本沒有代碼段和_start函數,怎麼辦呢?其實exec還有另外一種機制,如果要執行的是一個文本文件,並且第一行 指定了解釋器,則用解釋器程序的代碼段替換當前進程,並且從解釋器 的_start開始執行,而這個文本文件被當作命令行參數傳給解釋器。因此,執行上述腳本相當於執行程序

 

變量

按照慣例,Shell變量由全大寫字母加下劃線組成,有兩種類型的Shell變量:

  • 環境變量
  • 本地變量

1.環境變量
環境變量可以從父進程傳給子進程,因此Shell進程的環境變量可以從當前Shell進程傳給fork出來的子進程,用printenv命令可以顯示當前Shell進程的環境變量

2.本地變量
只存在於當前Shell進程,用set命令可以顯示當前Shell進程中定義的所有變量(包括本地變量和環境變量)和函數。

環境變量和本地變量的區別:
環境變量是任何進程都有的概念,而本地變量是Shell特有的概念。在Shell中,環境變量和本地變量的定義和用法相似。在Shell中定義或賦值一個變量:
  VARNAME=value
注意等號兩邊都不能有空格,否則會被Shell解釋成命令和命令行參數。

本地變量 轉爲 環境變量:
一個變量定以後僅存在於當前Shell進程,它是本地變量,用export命令可以把本地變量導出爲環境變量,定義和導出環境變量通常可以一步完成:
  export VARNAME=value
也可以分兩步完成:
  VARNAME=value
  export VARNAME

env 打印的是環境變量
set 顯示當前進程所有變量

在這裏插入圖片描述先用 VARNAME=value 定義好本地變量diner=gongbaojiding,然後進行測試驗證。

用unset命令可以刪除已定義的環境變量或本地變量。
  unset VARNAME
 

變量取值要加$ ,變量賦值數字,實際上是字符串
在這裏插入圖片描述

注意: 在定義變量時不用,取變量值時用,和C語言不通的是,Shell變量不需要明確定義類型,事實上Shell變量的值都是字符串,比如我們定義VAR=45,其實VAR的值是字符串45而非整數。Shell變量不需要先定義後使用,如果對一個沒有定義的變量取值,則值爲空字符串
在這裏插入圖片描述
————
接收用戶輸入(重點)
語法:read -p 提示信息 變量名 三個空格

案例:編寫一個腳本test6.sh,要求執行之後提示用戶輸入文件的名稱(路徑),然後自動爲用戶創建該文件
#touch test6.sh
vim test6.sh

#!/bin/sh
read -p ‘請輸入需要創建的文件路徑:’ filepath
touch $filepath
echo ‘文件創建成功’
ls -l $filepath
:x

chmod +x test6.sh
./test6.sh
在這裏插入圖片描述 

文件名代換

用於匹配的字符成爲通配符

通配符
* 匹配0個或多個任意字符
? 匹配一個任意字符
[若干字符] 匹配方括號中任意一個字符的一次出現

$ ls /dev/tty5*
$ ls ch0?.doc
$ ls ch0[0-2].doc

 

命名代換:` 或 $()

由 反引號 括起來的也是一條命令,Shell先執行該命令,然後將輸出結果立刻代換到當前命令行中,例如定義一個變量存放date命令的輸出:

$ DATE=`date`
$ echo $DATE
Sun Mar 15 17:41:45 PST 2020

命令代換也可以用$()表示:

$ DATE=$(date)

在這裏插入圖片描述
在這裏插入圖片描述
 

算數代換:$(())

用於算術代換,$ (())中的Shell變量取值將轉換成整數,同樣含義的$[]等價例如:

$ VAR=45
$ echo $(($VAR+3))
$(())中只能用+-*/和()運算符,並且只能整數運算。

$ [base#n],其中base表示進制,n按照base進制解釋,後面再有運算數,按十進制解釋
echo $[2#10+11]
echo $[8#10+11]
echo $[10#10+11]

在這裏插入圖片描述
 

轉義字符\

$ echo $SHELL
/bin/bash
$ echo \$SHELL
$SHELL
$ echo \\
\

比如創建一個文件名爲" $ $ "的文件可以這樣:

$ touch \$\ \$

還有一個字符雖然不具有特殊含義,但是要用它做文件名也很麻煩,就是-號。

即使加上\轉義也還是報錯
因爲各種UNIX命令都把-號開頭的命令行參數當作命令的選型,而不會當作文件名。如果非要處理以-號開頭的文件名,可以有兩種辦法:
$ touch ./-hello
或者
$ touch -- -hello

\還有一種用法,在\後敲回車表示續行,Shell並不會立刻執行命令,而是把光標移到下一行,給出一個續行命令提示符>,等待用戶繼續輸入,最後把所有的續行接到一起當作一個命令執行。例如:

$ ls \
> -l
(ls -l命令的輸出)

補充:
默認表通配符
\* 表乘號

 

單引號和雙引號

單引號:
單引號用於保持引號內所有字符的字面值,即使引號內的 \ 和回車也不例外,但是字符不能出現單引號。其次,如果引號沒有配對就輸入回車,Shell會給出續行提示符,要求用戶把引號配上對。例如:

$ echo 'SHELL'
$SHELL
$ echo 'ABC\(回車)
> DE'(再按一次回車結束命令)
ABC\
DE

雙引號:
被雙引號括住的內容,將視爲單一字串,它防止通配符擴展,但允許變量擴展。

雙引號括起來的變量會展開,單引號的不會展開
關於單雙引號的問題:
雙引號能夠識別變量,雙引號能夠實現轉義 (類似於 “ * ” 表乘號)
單引號是不能識別變量,只會原樣輸出。
在這裏插入圖片描述

運算符

1.關係運算符
在這裏插入圖片描述
2.邏輯運算符
在這裏插入圖片描述
3.字符串運算符
在這裏插入圖片描述[ = ] 是字符串比較, [ == ]是數值比較
在這裏插入圖片描述
4.文件測試運算符(重點)
文件測試運算符用於檢測 Unix /Linux 文件的各種屬性。 特有的
塊設備——U盤,光盤 重點記住綠色的
在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述
5.shell腳本附帶選項運算符
問題描述:在Linux shell中如何處理tail -n 10 access.log這樣的命令行選項
步驟:
調用tail指令
系統內核把後續選項傳遞給tail
tail先去打開指定的文件
取出最後10行


$0表腳本 $1表參數1 $2表參數2…

練習:創建自定義指令 “ user ”,可以直接執行(#user -add xx),要求該指令具備以下語法和功能:

a.#user -add 用戶名     【添加用戶】 
b.#user -del 用戶名	     【刪除用戶及其家目錄】

(原本系統自帶的是 useradd 和 userdel)
#vim test15.sh

#! /bin/bash
if [ $1 = ‘-add’ ]
then
useradd $2
else
userdel -r $2
fi

#chmod +x ./test5.sh
#./test15.sh -add user0404
#cat /etc/passwd
#ls /home/ 驗證成功
但這個不是完整的,要自定義指令,所以就
#vim ~/.bashrc //添加鏈接 ,即別名
alias user=’/root/test15.sh’
#su //切換用戶使剛纔的操作生效
#user -add aabbcc
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章