Shell基礎語法整理

一科平、變量賦值褥紫,變量傳參

定義變量 -- 字母 readonly 變量只讀(不可改變值) unset(刪除變量)

#!/bin/bash
value="hello" # 定義(不用 $)不可以有空格不然會出錯   重定義也是這樣的方式
echo $value   #用 $符號使用用變量的值
echo "${value} world" # 在字符串中也可以引用變量 {} 用于邊界檢測方便劃分可以不用寫
readonly value
unset value
arg=`date`       #命令替換方式 `` 符號 將命令執(zhí)行的結果存放在變量中         
echo $arg

特殊變量

echo $$    #表示當前 Shell進程的ID ,即pid
$0   當前腳本的文件名
$n   傳遞給腳本或函數(shù)的參數(shù)瞪慧。 n 是一個數(shù)字髓考,表示第幾個參數(shù)。例如弃酌,第一個參數(shù)是 $1氨菇,第二個參數(shù)是$2。
$#   傳遞給腳本或函數(shù)的參數(shù)個數(shù)妓湘。
$*   傳遞給腳本或函數(shù)的所有參數(shù)查蓉。
$@   傳遞給腳本或函數(shù)的所有參數(shù)。被雙引號 (" ")包含時榜贴,與 $* 稍有不同豌研,下面將會講到。
$?   上個命令的退出狀態(tài)唬党,或函數(shù)的返回值鹃共。
$$   當前 Shell進程 ID。對于 Shell 腳本驶拱,就是這些腳本所在的進程 ID霜浴。

$*$@的區(qū)別
$* 和 $@ 都表示傳遞給函數(shù)或腳本的所有參數(shù),不被雙引號 (" ")包含時蓝纲,都以 "$1" "$2" … "$n" 的形式輸出所有參數(shù)。
但是當它們被雙引號 (" ")包含時, "$*" 會將所有的參數(shù)作為一個整體,以 "$1 $2 … $n"的形式輸出所有參數(shù); "$@" 會將各個參數(shù)分開钧舌,
以"$1" "$2" … "$n" 的形式輸出所有參數(shù)。

參數(shù)傳遞 可用于函數(shù)的參數(shù)傳遞 和指令中參數(shù)傳入 如

sh sheel.sh hello        #執(zhí)行一個 shell腳本傳入?yún)?shù)hello 可以用 $1 獲取(指令傳參)
arg1=$1 ...$9,${10....}  #可以傳多個參數(shù) 到兩位數(shù)時要用 {}
argnum=$# 、$*           # $#參數(shù)數(shù)量  $* 所有參數(shù)
func1 1 2 3 4 5 6        #函數(shù)傳參 函數(shù)定義functionname() 不用寫參數(shù) 
字符串普通操作
#單引號 
str='this is a string'
單引號字符串的限制:單引號里的任何字符都會原樣輸出凌蔬,單引號字符串中的變量是無效的露懒;單引號字串中不能出現(xiàn)單引號(對單引號使用轉義符后也不行)闯冷。

#雙引號
雙引號的優(yōu)點:雙引號里可以有變量 雙引號里可以出現(xiàn)轉義字符

#拼接字符串
your_name="qinjx"
greeting="hello, " $your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1

#獲取字符串長度
string="abcd"
echo ${#string} # 輸出 4

#提取子字符串
string="alibaba is a great company"
echo ${string:1:4} # 輸出liba

#查找子字符串
string="alibaba is a great company"
echo `expr index "$string" is`

數(shù)組定義和操作

#bash支持一維數(shù)組(不支持多維數(shù)組),并且沒有限定數(shù)組的大小懈词。類似與 C語言蛇耀,數(shù)組元素的下標由 0開始編號。
#獲取數(shù)組中的元素要利用下標坎弯,下標可以是整數(shù)或算術表達式纺涤,其值應大于或等于 0。
#在Shell 中抠忘,用括號來表示數(shù)組撩炊,數(shù)組元素用“空格”符號分割開。
#定義數(shù)組的一般形式為: array_name=(value1 ... valuen)
例如:
array_name=(value0 value1 value2 value3 )

讀取數(shù)組元素值的一般格式是:
${array_name[index]}
#獲取數(shù)組的長度
#獲取數(shù)組長度的方法與獲取字符串長度的方法相同崎脉,例如:
#取得數(shù)組元素的個數(shù)
length=${#array_name[@]}
#或者
length=${#array_name[*]}
#取得數(shù)組單個元素的長度
lengthn=${#array_name[n]}

二拧咳、運算符

expr 是一款表達式計算工具,使用它能完成表達式的求值操作囚灼。
兩點注意:
表達式和運算符之間要有空格骆膝,例如 2 +2 是不對的,必須寫成 2 + 2灶体,這與我們熟悉的大多數(shù)編程語言不一樣阅签。
完整的表達式要被 `` 包含,注意這個字符不是常用的單引號蝎抽,在 Esc 鍵下邊政钟。

val=`expr 2 + 2`
echo "Total value : $val"
#-----------------算術運算符列表---------------#
#乘號(*) 前邊必須加反斜杠 (\)才能實現(xiàn)乘法運算;
運算符   說明                                                         舉例
+        加法                                                 `expr $a + $b` 結果為 30樟结。
-        減法                                                 `expr $a - $b` 結果為 10锥涕。
*        乘法                                                 `expr $a \* $b` 結果為  200。
/        除法                                                 `expr $b / $a` 結果為 2狭吼。
%        取余                                                 `expr $b % $a` 結果為 0层坠。
=        賦值                                                a =$b 將把變量 b 的值賦給 a。
==       相等刁笙。用于比較兩個數(shù)字破花,相同則返回 true谦趣。           [ $a == $b ] 返回 false。
!=       不相等座每。用于比較兩個數(shù)字前鹅,不相同則返回 true。       [ $a != $b ] 返回 true峭梳。
#-----------------關系運算符列表---------------#
運算符          說明                                                     舉例
-eq     檢測兩個數(shù)是否相等舰绘,相等返回 true。                       [ $a -eq $b ] 返回 true葱椭。
-ne     檢測兩個數(shù)是否相等捂寿,不相等返回 true。                     [ $a -ne $b ] 返回 true孵运。
-gt     檢測左邊的數(shù)是否大于右邊的秦陋,如果是,則返回 true治笨。        [ $a - gt $b ] 返回 false驳概。
-lt     檢測左邊的數(shù)是否小于右邊的,如果是旷赖,則返回 true顺又。        [ $a - lt $b ] 返回 true。
-ge     檢測左邊的數(shù)是否大等于右邊的等孵,如果是稚照,則返回 true。      [ $a - ge $b ] 返回 false流济。
-le     檢測左邊的數(shù)是否小于等于右邊的锐锣,如果是,則返回 true绳瘟。    [ $a - le $b ] 返回 true雕憔。
#-----------------布爾運算符列表---------------#
運算符          說明                                                     舉例
!       非運算,表達式為 true 則返回 false糖声,否則返回 true斤彼。   [ ! false ] 返回 true。
-o      或運算蘸泻,有一個表達式為 true 則返回 true琉苇。             [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a      與運算悦施,兩個表達式都為 true 才返回 true并扇。             [ $a -lt 20 -a $b -gt 100 ] 返回 false。
#-----------------字符串運算符列表---------------#
運算符   說明                                                             舉例
=       檢測兩個字符串是否相等抡诞,相等返回 true穷蛹。               [ $a = $b ] 返回 false土陪。
!=      檢測兩個字符串是否相等,不相等返回 true肴熏。             [ $a != $b ] 返回 true鬼雀。
-z      檢測字符串長度是否為 0,為0 返回 true蛙吏。                 [ -z $a ] 返回 false源哩。
-n      檢測字符串長度是否為0,不為 0返回 true 鸦做。              [ -z $a ] 返回 true励烦。
str     檢測字符串是否為空,不為空返回 true馁龟。                 [ $a ] 返回 true崩侠。
#-----------------文件測試運算符列表---------------#
操作符          說明                                                                                 舉例
-b file  檢測文件是否是塊設備文件漆魔,如果是坷檩,則返回 true。                                      [ -b $file ] 返回 false改抡。
-c file  檢測文件是否是字符設備文件矢炼,如果是,則返回 true阿纤。                                    [ -b $file ] 返回 false句灌。
-d file  檢測文件是否是目錄,如果是欠拾,則返回 true胰锌。                                            [ -d $file ] 返回 false。
-f file  檢測文件是否是普通文件(既不是目錄藐窄,也不是設備文件)资昧,如果是,則返回 true荆忍。        [ -f $file ] 返回 true 格带。
-g file  檢測文件是否設置了 SGID 位,如果是刹枉,則返回 true叽唱。                                    [ -g $file ] 返回 false。
-k file  檢測文件是否設置了粘著位 (Sticky Bit)微宝,如果是棺亭,則返回 true。                           [ -k $file ] 返回 false蟋软。
-p file  檢測文件是否是具名管道镶摘,如果是专甩,則返回 true。                                        [ -p $file ] 返回 false钉稍。
-u file  檢測文件是否設置了 SUID 位涤躲,如果是,則返回 true贡未。                                    [ -u $file ] 返回 false种樱。
-r file  檢測文件是否可讀,如果是俊卤,則返回 true嫩挤。                                              [ -r $file ] 返回 true。
-w file  檢測文件是否可寫消恍,如果是岂昭,則返回 true。                                              [ -w $file ] 返回 true狠怨。
-x file  檢測文件是否可執(zhí)行约啊,如果是,則返回 true佣赖。                                            [ -x $file ] 返回 true恰矩。
-s file  檢測文件是否為空(文件大小是否大于 0),不為空返回 true憎蛤。                              [ -s $file ] 返回 true外傅。
-e file  檢測文件(包括目錄)是否存在,如果是俩檬,則返回 true萎胰。                                  [ -e $file ] 返回 true。

三棚辽、控制流語句

#if 分支判斷語句
#if 語句通過關系運算符判斷表達式的真假來決定執(zhí)行哪個分支技竟。 Shell 有三種 if ... else 語句:
#if ... fi 語句;
#if ... else ... fi 語句晚胡;
#if ... elif ... else ... fi 語句灵奖。
#if ... else 語句的語法:
if [ expression ]
then
   Statement(s ) to be executed if expression is true
fi
#注意:expression 和方括號([ ])之間必須有空格,否則會有語法錯誤估盘。

#case 語句瓷患;
#case ... esac 與其他語言中的 switch ... case 語句類似,是一種多分枝選擇結構遣妥。

#case 語句匹配一個值或一個模式擅编,如果匹配成功,執(zhí)行相匹配的命令。 case語句格式如下:
case 值 in
模式1)
    command1
    command2
    command3
    ;;
模式2)
    command1
    command2
    command3
    ;;
*)
    command1
    command2
    command3
    ;;
esac
#case工作方式如上所示爱态。取值后面必須為關鍵字 in谭贪,每一模式必須以右括號結束。
#取值可以為變量或常數(shù)锦担。匹配發(fā)現(xiàn)取值符合某一模式后俭识,其間所有命令開始執(zhí)行直至 ;;。
#;; 與其他語言中的 break 類似洞渔,意思是跳到整個 case 語句的最后套媚。

#取值將檢測匹配的每一個模式。一旦模式匹配磁椒,則執(zhí)行完匹配模式相應命令后不再繼續(xù)其他模式堤瘤。
#如果無一匹配模式,使用星號 * 捕獲該值浆熔,再執(zhí)行后面的命令本辐。

#for 循環(huán)
#與其他編程語言類似,Shell支持 for循環(huán)医增。
#for循環(huán)一般格式為:
for 變量 in 列表
do
    command1
    command2
    ...
    commandN
done
#列表是一組值(數(shù)字慎皱、字符串等)組成的序列,每個值通過空格分隔调窍。每循環(huán)一次宝冕,就將列表中的下一個值賦給變量张遭。
#in 列表是可選的邓萨,如果不用它, for 循環(huán)使用命令行的位置參數(shù)菊卷。
#例如:
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

#while 循環(huán)
#while循環(huán)用于不斷執(zhí)行一系列命令缔恳,也用于從輸入文件中讀取數(shù)據(jù);命令通常為測試條件洁闰。其格式為:
while command
do
   Statement(s ) to be executed if command is true
done

#until 循環(huán)
#until 循環(huán)格式為:
until command
do
   Statement(s ) to be executed until command is true
done

#break命令
允許跳出所有循環(huán)(終止執(zhí)行后面的所有循環(huán))歉甚。
在嵌套循環(huán)中, break 命令后面還可以跟一個整數(shù)扑眉,表示跳出第幾層循環(huán)纸泄。例如:
break n
表示跳出第 n 層循環(huán)。

#continue命令
continue命令與break 命令類似腰素,只有一點差別聘裁,它不會跳出所有循環(huán),僅僅跳出當前循環(huán)弓千。

四衡便、輸入輸出重定向

輸出重定向
#命令的輸出不僅可以是顯示器,還可以很容易的轉移向到文件,這被稱為輸出重定向镣陕。
命令輸出重定向的語法為:
command > file
#如:會將信息輸出到users文件 > 會重寫文件不會被覆蓋 可以使用 >> 追加到文件末尾谴餐,例如:
who > users

#輸入重定向
#這樣,本來需要從鍵盤獲取輸入的命令會轉移到文件讀取內容呆抑。
#和輸出重定向一樣岂嗓,Unix 命令也可以從文件獲取輸入,語法為:
command < file

#嵌入外部腳本 將其他的 sh腳本 嵌入當前sh腳本中
#像其他語言一樣鹊碍,Shell 也可以包含外部腳本摄闸,將外部腳本的內容合并到當前腳本。
#Shell 中包含腳本可以使用:
. filename
或
source filename
#兩種方式的效果相同妹萨,簡單起見年枕,一般使用點號 (.),但是注意點號(.)和文件名中間有一空格乎完。

#例如熏兄,創(chuàng)建兩個腳本,一個是被調用腳本 subscript.sh树姨,內容如下:
url=" http://see.xidian.edu.cn/cpp/view/2738.html"
一個是主文件 main.sh摩桶,內容如下:
#!/bin/bash
. ./ subscript.sh
echo $url
#執(zhí)行腳本:
$chomd + x main.sh
./main.sh
http://see.xidian.edu.cn/cpp/view/2738.html
$
#注意:被包含腳本不需要有執(zhí)行權限。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末帽揪,一起剝皮案震驚了整個濱河市硝清,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌转晰,老刑警劉巖芦拿,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異查邢,居然都是意外死亡蔗崎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門扰藕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缓苛,“玉大人,你說我怎么就攤上這事邓深∥辞牛” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵芥备,是天一觀的道長冬耿。 經(jīng)常有香客問我,道長门躯,這世上最難降的妖魔是什么淆党? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上染乌,老公的妹妹穿的比我還像新娘山孔。我一直安慰自己,他們只是感情好荷憋,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布台颠。 她就那樣靜靜地躺著,像睡著了一般勒庄。 火紅的嫁衣襯著肌膚如雪串前。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天实蔽,我揣著相機與錄音荡碾,去河邊找鬼。 笑死局装,一個胖子當著我的面吹牛坛吁,可吹牛的內容都是我干的。 我是一名探鬼主播铐尚,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拨脉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宣增?” 一聲冷哼從身側響起玫膀,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎爹脾,沒想到半個月后帖旨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡誉简,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年碉就,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闷串。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖筋量,靈堂內的尸體忽然破棺而出烹吵,到底是詐尸還是另有隱情,我是刑警寧澤桨武,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布肋拔,位于F島的核電站,受9級特大地震影響呀酸,放射性物質發(fā)生泄漏凉蜂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窿吩。 院中可真熱鬧茎杂,春花似錦、人聲如沸纫雁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽轧邪。三九已至刽脖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間忌愚,已是汗流浹背曲管。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留硕糊,地道東北人翘地。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像癌幕,于是被迫代替她去往敵國和親衙耕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,383評論 0 5
  • .bat腳本基本命令語法 目錄 批處理的常見命令(未列舉的命令還比較多勺远,請查閱幫助信息) 1橙喘、REM 和 :: 2...
    慶慶慶慶慶閱讀 8,100評論 1 19
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)胶逢,斷路器厅瞎,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 我是個不懂享受的人。 我總是在最快樂的時候想起悲傷的事初坠,在擁有時想著如何失去和簸,在失去后卻開始苦苦挽留。我拆壞了最心...
    fhdtch閱讀 220評論 0 0
  • 主要用于圖片展示碟刺,并能實現(xiàn)滾動時縮放锁保,并停留在屏幕中間位置。 項目代碼見https://github.com/yo...
    游循子墨閱讀 213評論 0 0