shell_script2

来源:http://www.cnblogs.com/george-guo/archive/2017/06/29/7096253.html
-Advertisement-
Play Games

一、函數 1、簡介 Shell函數類似於Shell腳本,裡面存放了一系列的指令 不過,Shell的函數存在於記憶體,而不是硬碟文件,所以速度很快 另外,Shell還能對函數進行預處理,所以函數的啟動比腳本更快 2、定義 function 函數名() { 語句 [return] } 關鍵字functio ...


一、函數 1、簡介 Shell函數類似於Shell腳本,裡面存放了一系列的指令 不過,Shell的函數存在於記憶體,而不是硬碟文件,所以速度很快 另外,Shell還能對函數進行預處理,所以函數的啟動比腳本更快 2、定義 function 函數名() { 語句 [return] } 關鍵字function表示定義一個函數,可以省略,其後是函數名,有時函數名後可以跟一個括弧 符號“{”表示函數執行命令的入口,該符號也可以在函數名那一行,“}”表示函數體的結束,兩個大括弧之間是函數體 語句部分可以是任意的Shell命令,也可以調用其他的函數 在函數中使用 exit命令,可以退出整個腳本,通常情況,函數結束之後會返回調用函數的部分繼續執行 可以使用 break 語句來中斷函數的執行 函數的定義可以放到 .bash_profile 文件中,也可以放到使用函數的腳本中,還可以直接放到命令行中 函數可進行嵌套 可使用內部的unset命令刪除函數。一旦用戶註銷,Shell將不再保持這些函數 3、函數調用 3.1、命令行調用 # function show(){ --定義函數 show > echo "hello,you are calling the function" > } # function display() { --定義函數 display > echo "you display" > } # declare -f --顯示定義的函數清單 # declare -F --顯示定義的函數名清單 # show --命令調用函數 show # unset -f show --刪除 show 函數 3.2、腳本調用 # vim test.sh #!/bin/bash function show() {         --定義函數 echo "hello shell,i am $1" } show george --調用函數,george 為傳遞參數 4、參數傳遞 函數可以通過位置變數傳遞參數。例如: 函數名 參數1 參數2 參數3 參數4 當函數執行時,$1 對應 參數1,其他依次類推 5、返回值 函數中的關鍵字“return”可以放到函數體的任意位置,通常用於返回某些值 Shell在執行到return之後,就停止往下執行,返回到主程式的調用行 return的返回值只能是0~256之間的一個整數,返回值將保存到變數“$?”中 # vim test.sh #!/bin/bash function abc() {   RESULT=$(expr $1 \% 2)   if [ "$RESULT" -ne "0" ];then   return 1   else   return 0   fi } echo "Please enter a number who can devide by 2" read N abc $N case $? in 0)    echo "yes ,it is"   ;; 1)   echo "no ,it isn’t"   ;; esac 6、函數的載入 如果函數在另外一個文件中,如 show 函數寫在了 function.sh 裡面了,我們就可以用 source 命令 # vim function.sh #!/bin/bash function show() {   echo "hello world" } # vim test.sh #!/bin/bash source function.sh show # ./test.sh 7、變數作用域 預設情況下,變數具有全局作用域,如果想把它設置為局部作用域,可以在其前加入local;例如: local a="hello" 使用局部變數,使得函數在執行完畢後,自動釋放變數所占用的記憶體空間,從而減少系統資源的消耗,在運行大型的程式時,定義和使用局部變數尤為重要   二、函數實操 1、判斷 user 是否存在,若存在輸出其 shell;要求: 從命令行參數接受一個用戶名,根據該用戶是否存在而輸出相應的信息 腳本裡面定義一個函數,用於查詢用戶是否存在 定義另外一個函數,用於獲取用戶的 shell # vim test.sh #!/bin/bash exist() { if [ -z "$1" ]; then --函數內部的 $1 代表函數的第一個參數 echo "wrong parameter" >&2 return 1 fi local file=/etc/passwd --定義一個局部變數 grep -qE "^${1}:" $file return $? --函數返回一個值 } getshell() { if [ -z "$1" ]; then echo "wrong parameter" >&2 return 1 --返回非零,用於表示出錯 fi local file=/etc/passwd local line shell line=$(grep -E "^${1}:" $file) shell=${line##*:} echo $shell return 0 }   if [ -z "$1" ];then --這裡的$1 不在函數中,代表的是腳本的第一個參數 echo "Usage: $(basename $0) <username>" >&2 exit 1 fi user=$1 if exist $user; then --調用函數 exist 就像調用普通命令一樣 echo "Shell of user $user: $(getshell $user)" --調用函數getshell else echo "user $user doesn't exist" fi 2、要求: 定義一個函數,用於查詢某個用戶的最後登錄時間 要求在函數中出現的變數必須是本地變數 如果查詢到結果,函數應該返回真值,否則,應該返回假值 如果能夠查到記錄,就輸出記錄,否則就輸出相應的出錯信息 # vim test.sh #!/bin/bash help() { echo "Usage: user_last <name>" >&2 } last_log() { local time time=$(lastlog -u ${username} | tail -n1 | awk '{print $(NF-5),$(NF-4),$(NF-3),$(NF-2),$(NF-1),$NF}') if [ -z "$time" ];then echo "no record" return 1 else echo "last login time of user $username: $time" return 0 fi } if [ -z "$1" ]; then help exit 1 fi username=$1 last_log     三、基本調試方法 1、bash -x --把所執行的命令及其參數列印到標準錯誤 2、bash -n --讀取命令,但不執行,可用於檢查語法的正確性;但不能檢查具體的邏輯正確性 3、縮小代碼範圍 --刪除部分代碼,或者註釋掉部分代碼,以縮小問題的範圍;可以使用Here document 快速地註釋一部分代碼: :<< 'DEBUG' command...... DEBUG  
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、JavaCC JavaCC是java的compiler compiler。JavaCC是LL解析器生成器,可處理的語法範圍比較狹窄,但支持無限長的token超前掃描。 安裝過程: 我是從github上down下來的zip壓縮包,然後安裝了下ant, 然後通過ant安裝的javacc 1. 首先下 ...
  • 首先辨析“/”與“\” window中的路徑一般用“\”; java中的路徑一般用“/”;如果用“\”需要對其轉義成“\\” 1、絕對路徑 以根目錄作為參考點的的文件或文件夾所在的路徑,是硬碟上的真實路徑。具有唯一性的特點。 例如:C:\caosiege\python\project\C.py,代表 ...
  • 題目描述 設G為有n個頂點的有向無環圖,G中各頂點的編號為1到n,且當為G中的一條邊時有i < j。設w(i,j)為邊的長度,請設計演算法,計算圖G中<1,n>間的最長路徑。 輸入輸出格式 輸入格式: 輸入文件longest.in的第一行有兩個整數n和m,表示有n個頂點和m條邊,接下來m行中每行輸入3 ...
  • 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 鑽石 Diamond 題解 查看運行結果 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 鑽石 Diamond 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 鑽石 Diamond 時間限制: 1 ...
  • 目錄 tarnado tarnado源碼安裝 tarnado測試程式 application類的解析 一. tarnado簡介 最近在學習Python,無意間接觸到的tarnado,感覺tarnado還蠻好的那麼tarnado到底什麼呢?tarnado是由Python開發的一個非阻塞式web伺服器框 ...
  • Python使用openpyxl讀寫excel文件 這是一個第三方庫,可以處理 格式的Excel文件。 安裝。如果使用Aanconda,應該自帶了。 讀取Excel文件 需要導入相關函數。 預設打開的文件為可讀寫,若有需要可以指定參數 為`True`。 獲取工作表 Sheet 獲取單元格 返回 , ...
  • 題目描述 Description You are a mouse that lives in a cage in a large laboratory. 你是一隻生活在籠子里的實驗室老鼠。 The laboratory is composed of one rectangular grid of s ...
  • John Doe, a skilled pilot, enjoys traveling. While on vacation, he rents a small plane and starts visiting beautiful places. To save money, John must ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...