1. 程式人生 > >linux下的shell指令碼編寫

linux下的shell指令碼編寫

        下面我參考網上寫的較好的文章,加上自己的一點理解修改。僅供看家參考。

        Shell是一種具備特殊功能的程式,它是結語使用者和UNIX/Linux作業系統核心程式(kernel)之間的一個介面。是為了遮蔽核心的複雜性,也為了保護核心以免使用者誤操作造成損害,在核心周圍建立一個外殼(shell),使用者想shell提出請求,shell解釋並將請求傳給核心。

        shell標準有 Bourne shell(sh),Korn shell(ksh),C shell(csh),Bourne Again Shell(bash)。

                        可以通過在終端輸入:echo $SHELL 來檢視當前shell。

        shell程式設計語言支援絕大多數在高階語言中能見到的程式元素,如函式,變數,陣列和程式控制結構。任何在提示符中能鍵入的命令,都能放到一個可執行的shell程式中。

        本質上,shell指令碼是命令列命令簡單的組合到一個檔案裡面,shell基本上是一個命令直譯器,類似於DOS下的command.com。接收使用者命令,然後呼叫相應的應用程式。

        通過編寫一個shell來介紹shell的特點

        shell檔案的字尾名為.sh,如編寫一個名為HelloShell的shell,其名稱就是HelloShell.sh,一般我們使用vi或者vim來編寫shell。

        #!/bin/sh                    ——shell檔案第一行

        shell指令碼是按行解釋的,指令碼的第一行總是已 #!/bin/sh開頭,其中的sh表示使用的shell標準,目前新的版本中sh是指向bash也就是說在新版系統中,sh跟bash的指令碼型別是一樣。當然我們也可以替換成自己使用的shell型別。但你要確保在/bin/目錄下有這個型別的執行檔案。

        #HelloShell.sh

        #To show the enter name

        在shell中已#號開都的行為註釋行,一般第二行顯示shell檔名稱,第三行簡單解釋下這個shell的作用,比如我們所寫的shell是為了將使用者輸入的名稱顯示出來。

        echo -n "Enter Your Name:"                 ——系統執行到這一行後會在終端顯示“Enter Your Name:”,然後停下來等待使用者輸入,使用者可以輸入一行資料,-n引數的意思是不輸出末尾的換行符,也就是使用者在這行的末尾輸入資料,對應的引數是-e,換行輸入資料。echo的其它引數可以通過 man echo來檢視

        read NAME                     ——這行命令是讀取儲存使用者輸入的資料,並通過變數NAME來引用資料

        echo "Hello $NAME"              ——這行的效果就是在終端顯示你輸入的資料,通過$NAME來獲取之前儲存到NAME引用下的資料。

        編寫完成後儲存退出。之後可以通過給檔案加執行許可權直接執行指令碼,也可以通過“sh 指令碼名稱”形式來執行指令碼。許可權新增如下:

                     chmod u+x HelloShell.sh

        shell指令碼常見變數:

        shell中的變數一般用大寫字母表示。使用echo命令獲取單個變數值。

   設定只讀變數:如果設定變數時,不想改變其值,在變數前加上readonly可以將其設定為只讀。***給變數賦值的時候=左右不能有空格***

        name=value

        readonly name

    刪除變數:unset name

  陣列變數:        

        給元素賦值:list【index】=value

        給整個陣列賦值變數:list=(value1 value2 value3 value4... valuen),元素之間用空格分離。

        為部分元素賦值:list=([0]=value1 [3]=value3... [n]=valuen)

        訪問單個值:${list[index]}

        訪問整個陣列:${list[*]}

                                    ${list[@]},可以處理包含空格的陣列元素

       刪除陣列元素與刪除變數:

           unset list【index】 ,也可以用list【index】=後面賦值為空,變數賦值為空和刪除是有區別的,區別只是在使用${variable+string}和${variable?string}形式才會出現。

           unset list刪除整個陣列,list=空只會清除第一個元素值

    常用的shell變數:

                         PWD,UID,SHLVL,REPLY,RANDOM,SECONDS,IFS,PATH,HOME

        位置變數:在shell中$0輸出的是shell指令碼的名稱,$1~$9表示的是指令碼引數

        特定變數:$#  ——  表示指令碼的引數個數

                            $*  ——  傳遞到指令碼的引數,與位置變數不同,引數選項可超過9個,使用echo $*,將輸出所有引數

                            $$ ——  指令碼執行時,當前程序的ID號,常用作臨時變數的字尾

                            $!  ——  後臺執行的(&)最後一個程序的ID號,這個沒用過。

                            [email protected]  ——  與$#相同,使用時加引號,並在引號中返回引數個數,這個也沒用過

                            $-  ——  上一個命令的最後一個引數

                            $?  ——  最後命令退出狀態,0表示沒有錯誤,其它值表示錯誤型別

        邏輯操作符:

                            -a  —— 邏輯與(and) 如:判斷檔案file1可讀並且檔案file2可寫是否成立,【 -r file1.c -a -w file2.c 】

                            -o  —— 邏輯或(or)

                            !  —— 邏輯否

        字串測試:

                            =  ——兩個字串相等

                            !=  ——  兩個字串不相等

                            -z  —— 空串      如,判斷HelloShello.sh檔案是否為空:【 -z HelloShello.sh 】

                            -n  —— 非空串

        數值測試:

                            -eq=  ——  數值相等(equal to)如判斷10是否等於12:【 “10” -eq “12” 】

                            -ne  ——  數值不相等(not equal to)

                            -gt  ——  第一個數大於第二個數(greater than)

                            -lt  ——  第一個數小於第二個數(less than)

                            -le  ——  第一個數等於第二個數

                            -ge  ——    第一個數大於等於第二個數

        控制結構:

               選擇結構:

                           if語句:if then else提供條件測試,格式如:

               if 【 判斷條件 】

                   then

                        命令語句1

                   elif 【 判斷條件 】

              then

                        命令語句2

              else

                        命令語句3

              fi

                           case語句:匹配判斷,格式如:

              case 值 in  ——  後面必須跟in

                   模式1)  ——  後面必須有右括號

                           命令語句1

                           ;;   ——  執行語句結束標誌

                   模式2)

                           命令語句1

                           ;;

              esac

               迴圈結構:

                           for:迴圈處理列表內的資訊,格式如:

              for 變數 in 列表

              do

                     命令語句

              done

                           until:判斷條件在迴圈末尾,至少執行一次,格式如下:

              until 條件

              do

                     命令語句

              done

                           while:判斷條件在迴圈頭部,格式如下:

              while 條件

              do

                     命令語句2

              done

         函式相關的以後再說!

相關推薦

Linuxshell指令碼報錯 [: test: unexpected operator

最近編譯 ssd的create_list.sh指令碼遇到 [: test: unexpected operator的問題, 後來發現是由於 []等問題引起的,查閱資料發現是 Linux預設sh連結到dash的,和bash不相容, dash應該也是和bash相似的一種shell指令碼

LinuxShell指令碼實現批量重新命名資料夾,批量重新命名檔案(讓原本繁重的工作變得簡單)

最近接了個專案,具體做什麼都不說了,其中有個工作就是批量更改資料夾,然後批量更改資料夾下的檔名字,一會兒先貼程式碼,再詳細解釋步驟。 下面是我的簡化版的目錄結構,實際上有上百個。 project dir1 dir1.py dir2

linux shell指令碼執行多個命令的方法

1.每個命令之間用;隔開 說明:各命令的執行給果,不會影響其它命令的執行。換句話說,各個命令都會執行, 但不保證每個命令都執行成功。 2.每個命令之間用&&隔開說明:若前面的命令執行成功,才會去執行後面的命令。這樣可以保證所有的命令執行完畢後,執行過程都是

Linuxshell指令碼定時執行

1.啟動crond服務 輸入命令:service crond restart Stopping crond: [ OK ] Starting crond:

linuxshell指令碼中sed命令使用變數

用linpack做測試,寫了一個指令碼, 因為每次可修改的引數寫在了配置檔案裡,所以腳本里用sed命令來修改配置檔案#測試次數echo “Input Number of tests:”read numt#每次測試的資料規模,測試次數有多少次,這裡應該又多少組數字,中間以空格隔

linuxshell指令碼防ssh暴力破解

文章出處:http://coolnull.com/2059.html 說明: 本篇實現shell統計訪問失敗的IP和次數,從而根據這些再通過防火牆規則來限制這些IP再次暴破,指令碼如下:實現: 1.編寫shell指令碼 # cat /root/ssh_failed.sh

Linuxshell指令碼export命令

轉載:http://www.cnblogs.com/flying-tiger/p/5616934.html 1.export命令 Linux export命令用於設定或顯示環境變數。 在shell中執行程式時,shell會提供一組環境變數。export可新增,修改或刪

linuxshell指令碼編寫

        下面我參考網上寫的較好的文章,加上自己的一點理解修改。僅供看家參考。         Shell是一種具備特殊功能的程式,它是結語使用者和UNIX/Linux作業系統核心程式(kernel)之間的一個介面。是為了遮蔽核心的複雜性,也為了保護核心以免使用者誤

linux 使用expect編寫shell 指令碼互動訪問遠端伺服器

使用命令列登陸遠端伺服器一般需要ip地址以及登陸密碼等,每次都手動輸很不方便,expect可以滿足自動輸入密碼。下面是詳細的介紹: 首先安裝expect: 我用的是ubuntu14.04,使用sudo apt-get install expect即

Linux入門學習筆記(五)--Shell指令碼編寫

Shell指令碼的HelloWorld:     cd /自己的路徑下     vi helloworld.sh 進入之後,預設是命令狀態,按i進入編輯模式     內容:         #! /bin/bash         echo "Hello World!"   

一個很牛的 linux shell指令碼編寫的俄羅斯方塊遊戲例項程式碼,非常牛逼

可以將下面程式碼直接儲存為sh檔案。 #!/bin/bash   # Tetris Game # 10.21.2003 xhchen< [email][email protected][/email]>   #APP declaration

Linux Shell指令碼編寫規範、例子

一、規範 Linux的Shell種類眾多,常見的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、She

linuxshell for 迴圈執行不等待php指令碼返回

 #!/bin/bash for i in {1..20} do         `cd /usr/xxxx ;php test.php > /dev/null &` done  ------------------------------------

Linux系統shell指令碼語言學習手冊指南

 Linux shell指令碼全面學習   1. Linux 指令碼編寫基礎   1.1 語法基本介紹   1.1.1 開頭   程式必須以下面的行開始(必須方在檔案的第一行):   #!/bin/sh   符號#!用來告訴系統它後面的引數是用來執行該檔案的程

linuxshell指令碼判斷一個變數值或字串是否為整數

在實際的應用開發中,由於shell缺少許多函式庫,所以判斷字串是否為整數就不是一件容易的事兒,那麼這裡介紹一般的用於判斷一個字串是否為整數的方法。 原理: 一、利用expr做計算時變數或字串必須是整數的規則,把一個變數或字串和一個已知的整數(非0)相加,看命令返回的值是否

轉:linuxshell顯示-bash-4.1#不顯示路徑解決方法

所屬組 再次 修改 root 顯示 lin 解決 use .bashrc 幾個可能導致的原因: 1 用戶的家目錄所屬組被改為root,解決方法使用root執行cd /home/;chown username:username username 2 用戶的家目錄被修改,這個時

Linuxshell反彈

shell反彈服務器192.168.22.134開啟端口監聽,監聽端口1234nc -lvnp 1234++++++++++++++++++++++分割線+++++++++++++++++++++++++++客戶機192.168.22.136開啟反彈bash -i >& /dev/tcp/192

linuxshell顯示-bash-4.1#不顯示路徑解決方法

area 不用 source 解決方法 cal pro sin key -bash-4.1 在linux shell中不顯示路徑了,顯示為-bash-4.1#用起來很不方便。 如何改為顯示路徑的shell呢? 步驟如下: vim ~/.bash_profi

LinuxShell重定向

amp 操作 tab /dev/ 輸出重定向 esc /etc cal 信息 1. 標準輸入,標準輸出與標準錯誤輸出 Linux下系統打開3個文件,標準輸入,標準輸出,標準錯誤輸出。 標準輸入:從鍵盤輸入數據,即從鍵盤讀入數據。 標準輸出:把數據輸出到終端上。 標準錯誤輸出

LinuxShell命令的輸出信息同時顯示在屏幕和保存到日誌文件中

blog inux -a 輸出 輸出內容 使用 col 文件中 信息 #直接覆蓋日誌文件 ls -l | tee ./t.log #將輸出內容附加到日誌文件 ls -l | tee -a ./t.log 使用的是tee命令Linux下She