引用於網路
引言:
當你開始接觸linux的時候,當你用命令列實現一鍵功能的時候,心裡一陣暗爽。暗爽過後便是想去了解,什麼幫助我們實現這樣的自動化的。這個時候你一定就了解到shell指令碼語言了。對於乙個出入shell指令碼世界的小白是我來說,迫不及待的學習shell相關語法起來。這個時候自己按照網上教程開始寫一些簡單的shell例子來執行。期間自己發現自己按照網上的教程來寫的例子卻無法執行起來在某些語句。反覆的去比較發現沒有錯誤啊,通過請教shell指令碼的同事大神才知道原因,下面寫出自己的分享,希望可以幫助到一起在shell指令碼學習路上的小夥伴繞過一些坑,哪怕對你有一點點幫助,也將是我繼續下去的動力。
內容分享:
下面給出自己執行失敗的命令列和例子**:
下面例子的檔名:test1.sh
#!/bin/sh
skill="statrs shell"
echo "$skill" #輸出字元變數
echo $ #輸出字元變數的長度
echo $ #輸出第乙個到第四個字元
執行命令: sh test1.sh
執行結果: statrs shell
13test1.sh: 5: test1.sh: bad substitution //報錯了這裡,最後一句話沒法執行成功
這裡相信大多數夥伴對於linux系統針對我們執行命令的直譯器還不清楚,這裡我們必須要知道我們在執行指令碼語言的時候,直譯器不一樣指令碼語法上會有一些差別,這也就造成了你在執行別人ok的**的時候,到你這裡就失敗。下面我們介紹下檢視我們系統sh命令對應的指令碼直譯器。
輸入命令: cd /bin //到達bin目錄下
ls -l //檢視目錄下檔案資訊
檢視結果:
-rwxr-xr-x 1 root root 36232 may 23 2013 setfacl
-rwxr-xr-x 1 root root 39896 feb 18 2013 setfont
-rwxr-xr-x 1 root root 12052 jan 29 2014 setupcon
lrwxrwxrwx 1 root root 4 may 13 2015 sh -> dash //我們的sh命令指向的是 dash直譯器,例子中用**預設使用 bash直譯器!
lrwxrwxrwx 1 root root 4 may 13 2015 sh.distrib -> dash
-rwxr-xr-x 1 root root 31296 mar 24 2014 sleep
-rwxr-xr-x 1 root root 76624 feb 17 2014 ss
lrwxrwxrwx 1 root root 7 may 13 2015 static-sh -> busybox
-rwxr-xr-x 1 root root 68256 mar 24 2014 stty
-rwsr-xr-x 1 root root 36936 feb 16 2014 su
-rwxr-xr-x 1 root root 27200 mar 24 2014 sync
下面我們給出正確的直譯器的命令: bash test1.sh
執行結果:statrs shell //輸出的變數
13 //字串長度
tatr //字串中的第乙個字元到第四個字元
所以對於剛剛入門的shell指令碼的朋友,對於相關指令碼的直譯器要注意起來了,自己去檢視下自己linux的預設的指令碼直譯器是什麼。下面自己也在網上查了下兩個直譯器在語法上有那些區別。
linux 作業系統預設的 shell 是bourne again shell,它是 bourne shell 的擴充套件,簡稱 bash,與 bourne shell 完全向後相容,並且在bourne shell 的基礎上增加、增強了很多特性。
gnu/linux 作業系統中的 /bin/sh 本是 bash (bourne-again shell) 的符號鏈結,但鑑於 bash 過於複雜,有人把 ash 從 netbsd 移植到 linux 並更名為 dash (debian almquist shell),並建議將 /bin/sh 指向它,以獲得更快的指令碼執行速度。dash shell 比 bash shell 小的多,符合posix標準。
debian和ubuntu中,/bin/sh預設已經指向dash,這是乙個不同於bash的shell,它主要是為了執行指令碼而出現,而不是互動,它速度更快,但功能相比bash要少很多,語法嚴格遵守posix標準。
語法上的主要的區別有:
1.定義函式
bash: function在bash中為關鍵字
dash: dash中沒有function這個關鍵字
2.select var in list; do command; done
bash:支援
dash:不支援, 替代方法:採用while+read+case來實現
3. echo
bash:支援展開
dash:不支援,替代方法, 採用seq外部命令
4. here string
bash:支援here string
dash:不支援, 替代方法:可採用here documents
5. >&word重定向標準輸出和標準錯誤
bash: 當word為非數字時,>&word變成重定向標準錯誤和標準輸出到檔案word
dash: >&word, word不支援非數字, 替代方法: >word 2>&1; 常見用法 >/dev/null 2>&1
6. 陣列
bash: 支援陣列, bash4支援關聯陣列
dash: 不支援陣列,替代方法, 採用變數名+序號來實現類似的效果
7. 子字串擴充套件
bash: 支援$,$
dash: 不支援, 替代方法:採用expr或cut外部命令代替
8. 大小寫轉換
bash: 支援$,$,$,$
dash: 不支援,替代方法:採用tr/sed/awk等外部命令轉換
9. 程序替換(command)
bash: 支援程序替換
dash: 不支援, 替代方法, 通過臨時檔案中轉
10. [ string1 = string2 ] 和 [ string1 == string2 ]
bash: 支援兩者
dash: 只支援=
11. [[ 加強版test
bash: 支援[[ ]], 可實現正則匹配等強大功能
dash: 不支援[[ ]], 替代方法,採用外部命令
12. for (( expr1 ; expr2 ; expr3 )) ; do list ; done
bash: 支援c語言格式的for迴圈
dash: 不支援該格式的for, 替代方法,用while+$((expression))實現
13. let命令和((expression))
bash: 有內建命令let, 也支援((expression))方式
dash: 不支援,替代方法,採用$((expression))或者外部命令做計算
14. $((expression))
bash: 支援id++,id--,++id,--id這樣到表示式
dash: 不支援++,--, 替代方法:id+=1,id-=1, id=id+1,id=id-1
Shell 指令碼初學
其實這個是因為伺服器卡不夠用,為了充分占用一塊卡的資源,需要寫個shell指令碼幫忙執行網路 shell是一種指令碼語言 區別於編譯語言 在unix上基本都通用。在我看來,這個指令碼主要並不是用來計算,而是用來管理打雜的。第乙個程式,還是輸出hello world吧。首先建立乙個指令碼檔案 vim ...
shell 指令碼初探
之前大神跟我說要學習一下 linux的shell 指令碼程式設計,可能是我看的太膚淺了,個人感覺這個東西吧,不是特別難。今天看了10分鐘,寫了幾句。感悟如下 首先,shell指令碼能夠獲取系統狀態 資訊。然後就是一些邏輯判斷,流程語句。可能還會涉及一些路徑獲取,檔案組合等操作,把這個和上面的流程結合...
shell指令碼初版
n 表示位置引數,從 1開始到9,比 較常用,如果超過 9個,則 以如下形 式使用 9,比較常用,如果超過9個,則以如下形式使用 9,比較常用 如果超 過9個,則以如下 形式使用 10 例如 vim test bin bash echo 0 1 2 代表所有的引數,就是講傳遞進來的若干個引數看成乙個...