eq linux_linux之shell编程(二)
今天給大家繼續來分析linux下的shell編程,在上一篇文章簡單的介紹了shell編程到底是什么,以及它的一些基本使用規則。我們今天主要來分享shell編程中的一些其他用法,比如說:條件語句,循環語句等;好了下面就開始了我們今天的內容了:
一、shell中的變量定義和引用:
1、變量定義和初始化:shell是弱類型語言(語言中的變量如果有明確的類型則屬于強類型語言;變量沒有明確類型就是弱類型語言),和C、C++語言不同。在shell編程中定義變量不需要制定類型,也沒有類型這個概念。
2、變量定義時可以初始化,使用=進行初始化賦值。在shell中賦值的=兩邊是不能有空格的。同時要注意:shell對語法非常在意,非常嚴格。很多地方空格都是必須沒有或者必須有,而且不能隨意有沒有空格。
3、變量賦值,變量定義后可以再次賦值,新的賦值會覆蓋老的賦值。shell中并不刻意區分變量的定義和賦值,反正每個變量就是一個符號,這個符號的值就是最后一個給他賦值時的值。
4、變量引用。shell中引用一個變量必須使用符號,符號就是變量解引用符號?;谏厦娴睦碚?#xff0c;我們現在來實戰演示:
#!/bin/bashstring="I love shell"
echo $string
演示結果:
root@txp-virtual-machine:/home/txp# source test.shI love shell
這里同時也演示一下在變量定義的時候,不要有空格錯誤演示:
#!/bin/bashstring ="I love shell"
echo $string
演示結果,你將會看到下面這樣的錯誤提示,雖然最終可以打印出來我們想要的結果,但是我們作為程序員一枚,自然是要做到—— 0 error , 0 warning :
root@txp-virtual-machine:/home/txp# source test.shNo command 'string' found, did you mean:
Command 'strings' from package 'binutils' (main)
Command 'strings' from package 'binutils-multiarch' (main)
Command 'spring' from package 'spring' (universe)
string: command not found
I love shell
擴展總結:
a、$符號后面跟一個字符串,這個字符串就會被當作變量去解析。如果這個字符串本身沒有定義,執行時并不會報錯,而是把這個變量解析為空。也就是說在shell中沒有被定義的變量其實就相當于是一個定義并賦值為空的變量。
b、變量引用的時候可以,也可以{var}。這兩種的區別是在某些情況下只能用而不能簡單的var。
c、還是主要在給變量賦值的時候不要在“=”與變量符號和所賦的值之間留空格,可能剛開始大家有點不習慣這種風格,比較在c和c++里面寫代碼,留空格,是一種代碼風格,日后別人去看代碼,看著也舒適;總之還是那句話,習慣了就好,畢竟規則是這么定的。
二、shell中調用linux命令:
有的時候,你不想輸入太多的命令,可以在寫一個shell腳本,把你要寫的命令操作全部寫進去,然后一鍵操作猛如虎,哈哈,于是乎,這里就出現了在shell腳本中使用命令兩種目的:
1、直接執行:
這里我演示一下,我查看當前目錄下有什么文件,我只要在shell腳本里面輸入一個ls命令就行,具體看下面演示:
#!/bin/bashls
然后我們只要執行這個腳本文件就能實現我的功能了,這里只是簡單的演示,有的時候寫腳本對我們幫助非常大,可以提高我們的工作效率:
root@txp-virtual-machine:/home/txp# source test.sh1 2.c Desktop Downloads fun.sh hello.c linux-2.6.35.7.tar.gz Music Public Templates test.sh Videos
1.c a.out Documents examples.desktop h.c linux-2.6.35.7 linux-2.6.35.7.tar.gz.1 Pictures return.sh test test.sj vmware-tools-distrib
2、反引號括起來執行。有時候我們在shell中調用linux命令是為了得到這個命令的返回值(結果值),這時候就適合用一對反引號(鍵盤上ESC按鍵下面的那個按鍵,和~在一個按鍵上)來調用執行命令:
#!/bin/bashPWD=`pwd`
echo $PWD
這里演示的結果是使用pwd命令用于顯示用戶當前所處的工作目錄:
root@txp-virtual-machine:pwd# source test.sh/home/txp
三、shell中的選擇分支結構:
看到選擇分支結構,大家應該都比較熟悉,第一反應就會想到if條件語句,沒錯就是它;在學習c、c++語言的時候,if條件語句對你來說簡直小菜一碟,但是shell中的格式跟我們c、c++中的不一樣,不過在掌握shell中的書寫格式后,因為寫法思想和之前的一樣,只是說換了一種形式而已,俗話說的好:“換湯不換藥”,同樣對你來說是小菜一碟。
1、條件測試語句類型:
文件測試語句邏輯測試語句
整數值比較語句
字符串比較語句
a、在這些語句中我們有的時候看別人腳本的時候,也經常會看到,因此我們必須掌握,日后也方便自己來寫shell腳本,下面是文件測試中常見遇到的參數類型匯總:
| -d | 測試文件是否為目錄類型 |
| -e | 測試文件是否存在 |
| -f | 判斷是否為一般文件 |
| -r | 測試當前用戶是否有權限讀取 |
| -w | 測試當前用戶是否有權限寫入 |
| -x | 測試當前用戶是否有執行權限執行 |
b、邏輯測試語符號(這個比較簡單,對于我們做嵌入式的,在c語言里面就已經掌握了非常好了):
這里用的比較多是邏輯與:&&(它表示當前面的命令執行成功后才會執行它后面的命令)
還有一個就是邏輯或:||(表示當前面的命令執行失敗后才會執行它后面的命令)
最后一種就是邏輯非:!(它表示把條件測試中的判斷結果取相反值。也就是說,如果原本測試的結果是正確的,則將其變成錯誤的;原本測試錯誤的結果則將其變成正確的)
c、整數比較運算符匯總:
| -eq | 是否等于 |
| -ne | 是否不等于 |
| -gt | 是否大于 |
| -lt | 是否小于 |
| -le | 是否等于或小于 |
| -ge | 是否大于或等于 |
d、字符比較運算符匯總:
| = | 比較字符串內容是否相同 |
| != | 比較字符串內容是否不同 |
| -z | 判斷字符串內容是否為空 |
2、if語句的三種格式書寫:
a、單分支結構:
if 條件測試操作then 命令序列
fi
b、雙分支結構:
if 條件測試操作then 命令序列1
else 命令序列2
fi
c、多分支結構:
if 條件測試擦做1then 命令序列1
elif 條件測試操作2
then 命令序列2
else
命令序列3
fi
3、實戰演示:
判斷文件是否存在,不存在的話,就創建一個這樣的文件:
#!/bin/bashif [ -f a.c ]
then echo "yes"
else
echo "no"
touch a.c
fi
演示結果:
root@txp-virtual-machine:/home/txp# source test.shno
root@txp-virtual-machine:/home/txp# ls
a.c
判斷目錄文件是否存在 ,這里我就以上面是否存在/hoem/txp這個目錄類型的文件來演示了:
#!/bin/bash[ -d /home/txp ]
echo $?
演示結果,這里注意通過Shell解釋器的內設$?變量顯示上一條命令執行后的返回值。如果返回值為0,則目錄存在;如果返回值為非零的值,則意味著目錄不存在:
root@txp-virtual-machine:/home/txp# source test.sh0
判斷字符串是否相等:
#!/bin/bashif [ "abc" = "abc" ]
then echo "equal"
else
echo "not equal"
fi
演示結果:
root@txp-virtual-machine:/home/txp# source test.shequal
用"-o"來演示邏輯或的使用:
#!/bin/bashif [ 12 -eq 12 -o "abc" = "abc" ]
then echo "yes"
else
echo "not"
fi
演示結果:
root@txp-virtual-machine:/home/txp# source test.shyes
判斷字符串是否為空:
#!/bin/bashstr=""
[ -z $str ] && echo "yes"
演示結果:
root@txp-virtual-machine:/home/txp# source test.shyes
四、總結:
限于篇幅原因,暫時就沒有寫for和while等循環結構了,而且上面注意一個地方就是在往[]里面寫判斷語句的時候,注意左右兩邊要有空格,同時if語句的多分支結構我沒有舉例子,因為這和c語言里一樣,只是說書寫形式稍微有點不一樣,下一篇文章繼續分享。如果有想深入學習shell編程的網友,可以在公眾臺回復shell,就有兩份shell電子書免費送給大家,希望對大家在學習上有幫助。
如果各位喜歡的我的文章,可以在下方點個在看(或者轉發也行),你的支持,就是我寫文分享最大的動力,感謝您的支持。不忘初心,方得始終。
往期文章:
linux之shell編程(一)
Linux內核學習(一)之Linux內核源碼目錄
歡迎留言交流
總結
以上是生活随笔為你收集整理的eq linux_linux之shell编程(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图书馆为什么使用sip2协议_RFID无
- 下一篇: 3d数学基础图形与游戏开发第二版_游戏开