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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

shell基本语法和执行

發布時間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 shell基本语法和执行 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

執行腳本:

編寫一個簡單的腳本test.sh:

#! /bin/sh cd .. ls

Shell腳本中用#表示注釋,相當于C語言的//注釋。但如果#位于第一行開頭,并且是#!(稱為Shebang)則例外,它表示該腳本使用后面指定的解釋器/bin/sh解釋執行。如果把這個腳本文件加上可執行權限然后執行:

chmod a+x test.sh ./test.sh

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

$ /bin/sh ./test.sh?

以這種方式執行不需要test.sh文件具有可執行權限。

如果將命令行下輸入的命令用()括號括起來,那么也會fork出一個子Shell執行小括號中的命令,一行中可以輸入由分號;隔開的多個命令,比如:

$ (cd ..;ls -l)

和上面兩種方法執行Shell腳本的效果是相同的,cd ..命令改變的是子Shell的PWD,而不會影響到交互式Shell。然而命令

$ cd ..;ls -l?

則有不同的效果,cd ..命令是直接在交互式Shell下執行的,改變交互式Shell的PWD,然而這種方式相當于這樣執行Shell腳本:

$ source ./test.sh

或者

$ . ./test.sh

source或者.命令是Shell的內建命令,這種方式也不會創建子Shell,而是直接在交互式Shell下逐行執行腳本中的命令。

基本語法

變量

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

1.環境變量

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

2.本地變量

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

環境變量是任何進程都有的概念,而本地變量是Shell特有的概念。在Shell中,環境變量和本地變量的定義和用法相似。在Shell中定義或賦值一個變量:

itcast$ VARNAME=value

注意等號兩邊都不能有空格,否則會被Shell解釋成命令和命令行參數。

一個變量定義后僅存在于當前Shell進程,它是本地變量,用export命令可以把本地變量導出為環境變量,定義和導出環境變量通常可以一步完成:

itcast$ export VARNAME=value

  也可以分兩步完成:

itcast$ VARNAME=value itcast$ export VARNAME?

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

itcast$ unset VARNAME

如果一個變量叫做VARNAME,用${VARNAME}可以表示它的值,在不引起歧義的情況下也可以用$VARNAME表示它的值。通過以下例子比較這兩種表示法的不同:

itcast$ echo $SHELL?

注意,在定義變量時不用$,取變量值時要用$。和C語言不同的是,Shell變量不需要明確定義類型,事實上Shell變量的值都是字符串,比如我們定義VAR=45,其實VAR的值是字符串45而非整數。Shell變量不需要先定義后使用,如果對一個沒有定義的變量取值,則值為空字符串。

文件名代換(Globbing):* ? []

這些用于匹配的字符稱為通配符(Wildcard),具體如下:

通配符* 匹配0個或多個任意字符 ? 匹配一個任意字符 [若干字符] 匹配方括號中任意一個字符的一次出現 $ ls /dev/ttyS* $ ls ch0?.doc $ ls ch0[0-2].doc $ ls ch[012] [0-9].doc

注意,Globbing所匹配的文件名是由Shell展開的,也就是說在參數還沒傳給程序之前已經展開了,比如上述ls ch0[012].doc命令,如果當前目錄下有ch00.doc和ch02.doc,則傳給ls命令的參數實際上是這兩個文件名,而不是一個匹配字符串。

命令代換:`或 $()

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

itcast$ DATE=`date` itcast$ echo $DATE

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

itcast$ DATE=$(date)

算術代換:$(())

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

itcast$ VAR=45 itcast$ echo $(($VAR+3)) $(())中只能用+-*/和()運算符,并且只能做整數運算。$[base#n],其中base表示進制,n按照base進制解釋,后面再有運算數,按十進制解釋。echo $[2#10+11] echo $[8#10+11] echo $[10#10+11]

轉義字符\

和C語言類似,\在Shell中被用作轉義字符,用于去除緊跟其后的單個字符的特殊意義(回車除外),換句話說,緊跟其后的字符取字面值。例如:

itcast$ echo $SHELL /bin/bash itcast$ echo \$SHELL $SHELL itcast$ echo \\ \?

比如創建一個文件名為“$ $”的文件可以這樣:

itcast$ touch \$\ \$

還有一個字符雖然不具有特殊含義,但是要用它做文件名也很麻煩,就是-號。如果要創建一個文件名以-號開頭的文件,這樣是不行的:

itcast$ touch -hello touch: invalid option -- h Try `touch --help' for more information. 即使加上\轉義也還是報錯: itcast$ touch \-hello touch: invalid option -- h Try `touch --help' for more information.

因為各種UNIX命令都把-號開頭的命令行參數當作命令的選項,而不會當作文件名。如果非要處理以-號開頭的文件名,可以有兩種辦法:

itcast$ touch ./-hello

或者

itcast$ touch -- -hello

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

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

單引號

和C語言不一樣,Shell腳本中的單引號和雙引號一樣都是字符串的界定符(雙引號下一節介紹),而不是字符的界定符。單引號用于保持引號內所有字符的字面值,即使引號內的\和回車也不例外,但是字符串中不能出現單引號。如果引號沒有配對就輸入回車,Shell會給出續行提示符,要求用戶把引號配上對。例如:

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

雙引號

被雙引號用括住的內容,將被視為單一字串。它防止通配符擴展,但允許變量擴展。這點與單引號的處理方式不同

itcast$ DATE=$(date) itcast$ echo "$DATE" itcast$ echo '$DATE'

?

轉載于:https://www.cnblogs.com/alexzhang92/p/9520994.html

總結

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

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