1. 程式人生 > >Shell指令碼通過引數傳遞呼叫指定函式

Shell指令碼通過引數傳遞呼叫指定函式

我們在寫一些功能性指令碼的時候,往往會把操作相似或者引數類似行為接近的函式放在同一個shell指令碼中,這樣管理方便,維護簡單,也很清晰。對於這種情況,通常的辦法是,在shell指令碼中定義所有用到的函式,然後在正文程式碼中用case語句讀入輸入的命令函式引數來呼叫指定的相應函式。這樣就達到一個shell指令碼使用的強大功能。

下面以一個簡單的例子來說明。一個計算器提供了加減乘除的功能:

#!/bin/bash
usage="Usage: `basename $0` (add|sub|mul|div|all) parameter1 parameter2"
command=$1
first=$2
second=$3
function add() {
        ans=$(($first + $second))
        echo $ans
}
function sub() {
        ans=$(($first - $second))
        echo $ans
}
function mul() {
        ans=$(($first * $second))
        echo $ans
}
function div() {
        ans=$(($first / $second))
        echo $ans
}
case $command in
  (add)
     add
     ;;
  (sub)
     sub
     ;;
  (mul)
     mul
     ;;
  (div)
     div
     ;;
  (all)
     add
     sub
     mul
     div
     ;;
  (*)
     echo "Error command"
     echo "$usage"
     ;;
esac

上面的這段shell指令碼,我們就可以通過傳入不同的引數呼叫達到不同的目的。
[[email protected]]$ ./calculator add 2 3
5
[[email protected]]$ ./calculator sub 2 3
-1
[[email protected]]$ ./calculator mul 2 3
6
[[email protected]]$ ./calculator div 2 3
0
[[email protected]]$ ./calculator all 2 3
5
-1
6
0
[[email protected]
]$ ./calculator a 2 3 Error command Usage: calculator (add|sub|mul|div|all) parameter1 parameter2

倘若我們不想每個函式都用同樣個數的引數,也就是不同的函式引數不一樣時候怎麼辦?這時候我們可以在函式體的內部讀入引數,然後在case後的相應呼叫語句時候也傳入相應的引數。
function double() {
        ans=$(($1 + $1))
        echo $ans
}
case $command in
  (dou)
     double "$first"   #you can also use "$2"
     ;;

當我們需要將command之後的引數原封不動傳給呼叫函式,而卻又要忽略command引數,這時候我們可以在呼叫前使用一次shift命令。shift命令實現將引數左移一位,這樣原來的第一個引數就消失了。

如果要將剩下的引數原封不動地傳給函式,可以使用引數$*;如果將剩下的引數組成一個命令字串傳給函式,則使用引數"$*"。區別就是是否用引號,有引號時候實際只傳了一個引數過去,它是當前shell中shift之後載入的引數的組合,沒有引號就是剩下的引數了。

相關推薦

Shell指令碼通過引數傳遞呼叫指定函式

我們在寫一些功能性指令碼的時候,往往會把操作相似或者引數類似行為接近的函式放在同一個shell指令碼中,這樣管理方便,維護簡單,也很清晰。對於這種情況,通常的辦法是,在shell指令碼中定義所有用到的函式,然後在正文程式碼中用case語句讀入輸入的命令函式引數來呼叫指定的相

shell指令碼引數傳遞和main函式引數傳遞方式類似

shell指令碼 test.sh呼叫的時候傳入引數,param1,param2: #test.sh param1 param2 那麼在指令碼內部相當於把 test.sh param1 param2 看成三個引數出入,所以引數0為$0 (test.sh),引數1為$1 (pa

Linux系統下編寫shell指令碼傳入引數列印系統當前執行緒數到指定檔案

  最近在做效能測試,要檢視系統執行過程中執行緒數,很簡單輸入命令:netstat -anp |grep java |wc -l,可以查詢。但是如何在執行過程定時列印系統執行緒數且將結果輸出到指定檔案呢?也很簡單我們直接寫一個shell指令碼執行下就可以了。以

VBS 指令碼通過條件程式實現全域性函式呼叫

效果動畫演示   步驟一:變數字典建立 步驟二:新建“視窗0”畫面 1、變數==>動畫(文字內容) 關聯 “變數” 2、按鈕“呼叫函式”  事件  “左鍵單擊”事件 Var.中間變數= Not Var.中間變

簡單的通過shell指令碼接收引數進行資料庫操作

建表sql語句: SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `cent_su

shell指令碼抽取文字檔案中指定字串的方法:sed+grep方法、awk+grep方法(必要時可以聯合sed以及grep)、grep+cut方法

在linux中經常要對一些動態的文字檔案抽取指定的字串,比如執行ps命令後想要獲取指定的執行程序(如ps自己)的PID號(同一個程序每次啟動的時候pid號是隨機分配的)。該怎麼辦呢?當然,可以用一些擷取字串的方法,這裡介紹一下用2種方法來解決這類問題。 一、sed+grep方法: 首先大概瞭

shell 指令碼通過nginx日誌封訪問頻率過高的IP

#/bin/bash #日誌檔案 logfile=/usr/local/tengine/logs last_minutes=1 #開始時間 start_time=`date -d"$last_minutes minutes ago" +"%H:%M:%S"` echo $start_t

shell指令碼專家指南筆記#2.使用函式

## # 本文為《shell指令碼專家指南》學習筆記。 ## 2.1. 使用庫 可以將常用函式,封裝如庫檔案中,在需要用對應函式時,只要匯入對應庫檔案即可。 示例:通過匯入庫檔案,就可以引用已寫好的函式。 比如,匯入OSTYPE環境變數。 #!/bin/echo WARN: this lib

第四章 php函式(自定義函式、變數範圍、引數傳遞,可變函式、遞迴函式、內建函式)

任何有效的php程式碼都可以作為函式體使用 //例子1 function add($a,$b){ echo $a+$b; } add(10,20); //php頁面顯示30 // 例子2 function add($a,$b){ return $a+$b; //r

Shell指令碼通過Java class檔案啟停Java程式

通過Shell指令碼啟動和停止Java程式(文章末尾附指令碼和程式原始碼地址) 步驟: 1,通過shell啟動指令碼啟動mainclass(非java -jar的方式) 2,記錄程序id 3,通過shell停止指令碼殺掉程序 示例專案結構和主類程式碼: 將工程編譯成

shell指令碼之正則表示式、函式、grep、sed、awk、printf等基本命令配置詳解

一、正則表示式 簡介: 正則表示式(或稱Regular Expression,簡稱RE)就是由普通字元(例如字元 a 到 z)以及特殊字元(稱為元字元)組成的文字模式。該模式描述在查詢文字主體時待匹配的一個或多個字串。正則表示式作為一個模板,將某個字元模式與所搜尋的字串進

nagios自定義監控指令碼接收引數傳遞

useradd nagiospasswd nagiostar zxvf nagios-plugins-1.4.16.tar.gzcd nagios-plugins-1.4.16./configure --prefix=/usr/local/nagiosmake &&a

shell 指令碼 輸入引數 學習

特殊變數 一般變數比較簡單哈,與Java、C/C++不一樣的地方在於不需要定義,直接使用即可。 例如: #!/bin/bash var= "wojiushimogui" echo ${var} 需要注意的兩點: 1、變數和等號之間不能有空格。 2、使用

shell 指令碼通過 dumpsys SurfaceFlinger --latency 資料計算 FPS 和評價流暢度。

由於採購機械臂測試效能用例和螢幕實際幀率變化,最終工具方案實現後擱置,拿出來”晒晒“。 一、設計初衷 1、面臨使用者和公司內領導試用中反饋的卡頓問題,思考如何能有效量化評估? 2、如何在嘗試復現卡頓的過程中持續監控FPS和丟幀情況? 二、設定預期倒推查詢解決方案

Shell指令碼引數處理方法

'getopt'與'getopts'類似,不過'getopts'只能處理短選項,'getopt'則能處理短選項和長選項。所謂的短選項就是類似下面這樣的選項: -a 而下面這樣的則是長選項 --action=delete 當然,事無絕對,通過一些技巧,用'getopts'處理長選項也是可能的。這裡先

筆記整理-U3D中不同指令碼引數傳遞

U3D中不同指令碼間引數傳遞1.被呼叫指令碼函式為static型別Static:靜態方法,設定為靜態的方法即使沒有例項化也可以被呼叫。呼叫時直接用指令碼名.函式名()。例項:指令碼b中:    public static void Tell0(stringM)    {   

shell指令碼——通過關鍵字查詢檔案路徑

#!/bin/bash echo -e "輸入查詢檔案內的關鍵字:" read  key if [ "$key" == "" ]; then     echo -e "keyword can no

Shell指令碼寫的簡單字串hash函式

#!/bin/bash Letter2Int(){ if [ "$#" -ne "0" ]; then echo "Letter2Int Wrong Paramenters!" >&2 return 1 fi read letter leng

題8:輸入5個數(含負數、小數)將它們按由小到大的順序排列起來 提示:需要排數的數字通過引數傳遞進來, 例如:輸入:./a.out -1 2.1 -3 5 7 輸出: -3 -1 2.1

題目:輸入5個數(含負數、小數)將它們按由小到大的順序排列起來 提示:需要排數的數字通過引數傳遞進來, 例如:輸入:./a.out -1 2.1 -3 5 7 輸出: -3 -1 2.1 #include <stdio.h> #include &l

linux shell指令碼 springboot專案釋出的shell指令碼 包括日誌輸出到指定的檔案

     專案釋出,寫了個shell指令碼來啟動專案,包括專案的啟動,關閉 重啟  包括專案的日誌輸出到指定的檔案 ,不為別的,就為了下次專案釋出的時候,能夠直接把指令碼拷貝過去用就行啦!哈哈!! 把這段shell指令碼複製過去,只要把紅色部分改為你自己專案的東西,就可以直接