Linux Shell——函數的使用

文/一介書生,一枚碼農。

scripts are for lazy people.

Linux Shell

函數是存在內存里的一組代碼的命名的元素。函數創建于腳本運行環境之中,并且可以執行。
函數的語法結構為:

function <function-name> {<code to execute>
}

創建函數不需要dodone這些關鍵字,只需要大括號來界定函數的作用范圍。
我們可以在命令行中創建一個簡單的函數:

function show_system {echo "The uptime is:"uptimeechoecho "Current dir:"pwdechoecho "Date:"date
}

在命令行定義上面的函數:

function in command line

然后執行函數:

show_system

最后,我們可以使用type命令查看函數的定義:

type show_system

方法可以有傳遞的參數。在此之前,我們先簡單介紹 sed命令,下面的腳本用來移除文件中的注釋行和空白行。

sed -i.bak '/^\s*#/d;/^$/d' <filename>

詳細介紹一下上面的腳本:

  • sed -i.bak:sed 命令會創建一個以.bak結尾的備份文件,用來備份原始的文件。
  • /^:表示行首。
  • \s*:匹配任何不可見字符,包括空格、制表符、換頁符等。
  • #/:shell 腳本中的注釋標記。/^\s*#/一起使用用來查找注釋行和帶有不可見字符的注釋行。
  • d:用來刪除匹配的行。
  • ;/^$/d;是表達式的分隔符,后面的表達式跟前面的表達式意思很像,用來刪除空白行, "$"匹配輸入字符串的結束位置。

我們把上面的腳本移到函數中,創建一個名為clean_file的函數:

function clean_file {sed -i.bak '/^\s*#/d;/^$/d' "$1"
}

上面的代碼中,我們使用位置參數$1來接收命令行里傳遞的參數,需要注意的是$1 用大括號來括起來。

下面,我們完善clean_file方法,新建一個腳本文件 clean.sh。代碼如下:

#!/bin/bash
# Script will prompt for filename
# And remove commented and blank linesfunction is_file {if [ ! -f "$1" ] ; thenecho "$1 does not seem to be a file"exit 2fi
}function clean_file {is_file "$1"BEFORE=$(wc -l "$1")echo "The file $1 starts with $BEFORE"sed -i.bak '/^\s*#/d;/^$/d' "$1"AFTER=$(wc -l "$1")echo "The file $1 is now $AFTER"
}read -p "Enter a file to clean: "
clean_file "$REPLY"
exit 1

其中,wc -l命令用來打印文件行數。
現在,我們新建一個用來測試的文件 test.txt,里面隨便寫些內容:

# This file is just for testing.Hello.World.# new comment.$The end.

在 test 文件所在的目錄下,執行 clean.sh腳本:

clean.sh

然后查看 test 文件和 test.bak 文件,發現空白行和注釋行已經刪除。

cat test

這里需要注意的是,shell 腳本是從上至下來執行的,如果在一個函數中調用了另一個函數,那么被調用的函數要定義在調用函數的前面。

當然,除了函數可以傳遞參數外,還可以有返回值。默認情況下,在執行完函數內的最后一行代碼后,方法會返回一個狀態的數字,你可以使用$?變量來查看函數執行的狀態。如果返回值為0,表示方法正常退出,非0表示程序發生錯誤或其他非正常退出。
我們使用return關鍵字來返回一個整數。這里需要注意兩點:

  • 函數一旦執行完就會返回狀態代碼。
  • 狀態代碼的范圍為0到255。

如果不想返回函數的狀態代碼,而是想返回一個字符串或是其他類型,可以使用 echo 變量的方式來返回值。

下面創建腳本文件 translate.sh,用來把文件中的大寫字符轉換為小寫字符:

#!/bin/bash
# Script that translates upper letter to low letterfunction to_lower ()
{input="$1"output=$(tr '[A-Z]' '[a-z]' <<< "$input")echo $output
}while true
doread -p "Enter c to continue or q to exit: "result=$(to_lower $REPLY)echo "After translate: $result"if [ $result = "q" ] ; thenbreakfidone
echo "Finished"

代碼會把輸入的大寫字符變成小寫字符,當輸入"Q"或"q"時程序退出。

轉載于:https://www.cnblogs.com/IcanFixIt/p/6796453.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372283.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372283.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372283.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FFmpeg學習2:解碼數據結構及函數總結

在上一篇文章中&#xff0c;對FFmpeg的視頻解碼過程做了一個總結。由于才接觸FFmpeg&#xff0c;還是挺陌生的&#xff0c;這里就解碼過程再做一個總結。本文的總結分為以下兩個部分&#xff1a; 數據讀取&#xff0c;主要關注在解碼過程中所用到的FFmpeg中的結構體。解碼過程中…

python1~10階乘while_Python3基礎 while 階乘

?python : 3.7.0OS : Ubuntu 18.04.1 LTSIDE : PyCharm 2018.2.4conda : 4.5.11type setting : Markdown?code"""Author : 行初心Date : 18-9-24Blog : www.cnblogs.com/xingchuxinGitHub : github.com/GratefulHeartCoder"""def main():count…

JavaFX 2 GameTutorial第4部分

介紹 這是與JavaFX 2游戲教程相關的六個部分系列的第四部分。 如果您錯過了第1部分 &#xff0c; 第2部分或第3部分 &#xff0c;我建議您在開始本教程之前仔細閱讀它們。 回顧一下&#xff0c;在第3部分中&#xff0c;我為您提供了許多經典街機風格游戲和所使用的不同輸入設備…

關于ListView的作業

原生布局并未多做修改 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android" xmlns:tools"http://schemas.android.com/tools" android:id"id/activity_m…

Java 7的類型推斷

每個優秀的程序員都喜歡編寫簡潔但有效且經過優化的代碼。 類型推斷是JDK 7中引入的一種方法&#xff0c;它肯定會為您帶來更少鍵入的好處。 您以以下方式使用Java代碼已有很長時間了。 但是&#xff0c;在初始化Collections的特定實現時&#xff0c;您是否曾經想到過代碼重復&…

python實現膠囊網絡_膠囊網絡 -- Capsule Networks

膠囊網絡是 vector in vector out的結構&#xff0c;最后對每個不同的類別&#xff0c;輸出不一個向量&#xff0c;向量的模長表示屬于該類別的概率。例如&#xff0c;在數字識別中&#xff0c;兩個數字雖然重疊在一起&#xff0c;Capsule中的兩個向量能完整表達兩個數字的特征…

基變換與過渡矩陣

取定線性空間的一組基&#xff0c;任何一組向量可以表示為基向量的線性組合&#xff0c;且是同構映射。兩個線性空間是同構。 不同的基向量&#xff0c;基向量之間的過渡矩陣 取線性空間的兩組基任一向量可以表示為這兩組向量的線性組合將一組基向量表示為另外基向量的線性組合…

bootstrap的滾動監聽

<!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1,maximum-scale1, user-scalableno"><title>下拉菜單和滾動監…

java構造函數_JAVA的構造函數是怎么寫的。萬分感謝。路過的請不要嘲笑%_%

展開全部JAVA的構造函數是&#xff1a;SetLocal EnableDelayedExpansionset classpath.for %%c in (lib\*.jar) do set classpath!32313133353236313431303231363533e59b9ee7ad9431333431363030classpath!;%%cset classpath%classpath%;./classes;java com.ham.server.Server。…

在Spring中使用Redis

隨著NoSQL解決方案在許多問題上越來越受歡迎&#xff0c;現代項目越來越多地考慮使用一些&#xff08;或幾種&#xff09;NoSQL代替&#xff08;或并排&#xff09;傳統RDBMS。 我已經在本 &#xff0c; 本和本文章中介紹了我在MongoDB上的經驗。 在本文中&#xff0c;我想對Re…

C# 中winform的一些屬性設置

1 窗體的大小固定住&#xff0c;不能調整其大小 窗體FormBorderStyle 屬性設置為 FixedSingle; MaximizeBox 屬性設置為false; MinimizeBox 屬性設置為 false; 2. 在狀態欄中無圖標顯示 設置為fase即可。 3. 設置窗體的啟動位置 方法1&#xff0c; 用代碼控制 this.Location …

LiveBos---按鈕成下拉

轉載于:https://www.cnblogs.com/luhanzhen/p/6802779.html

Solr:創建拼寫檢查器

在上一篇文章中&#xff0c;我談到了Solr Spellchecker的工作原理&#xff0c;然后向您展示了其性能的一些測試結果。 現在&#xff0c;我們將看到另一種拼寫檢查方法。 與其他方法一樣&#xff0c;此方法使用兩步過程。 相當快速的“候選單詞”選擇&#xff0c;然后對這些單詞…

linux修改機器名稱

1 使用hostname命令&#xff1a;hostname 新機器名稱 2 修改vi /etc/sysconfig/network # cat /etc/sysconfig/network NETWORKINGyes HOSTNAMElocalhost.localdomain 注意&#xff1a;左側都必須大寫&#xff0c;等號附件沒有空格。 查看機器名稱使用hostname命令 轉載于:h…

java property_property在Java中的用法

展開全部在項目中經常用到各種配置文件62616964757a686964616fe78988e69d8331333337623561&#xff0c;有.properties的&#xff0c;也有.xml格式的都可以通過java.utils.Property類進行處理。1. 讀取.properties文件File pFile new File("test.properties");FileIn…

Django 和 html

下面是對應的形式&#xff0c;自定義的forms 轉載于:https://www.cnblogs.com/kilen/p/6804047.html

Grails動態下拉菜單

最近&#xff0c;我有一個UI要求&#xff0c;客戶希望從兩個單獨的下拉列表中選擇值。 第一個下拉列表的值實質上過濾了第二個下拉列表的值。 鑒于我們支持的財務項目對UI的要求并不嚴格&#xff0c;因此我不得不進行一些初步的學習和實驗&#xff0c;以實現良好的實施。 這篇博…

【Java大系】Java快速教程

感謝原作者&#xff1a;Vamei 出處&#xff1a;http://www.cnblogs.com/vamei Java是面向對象語言。這門語言其實相當年輕&#xff0c;于1995年才出現&#xff0c;由Sun公司出品。James Gosling領導了Java的項目小組。該項目的最初只想為家電設計一門容易移植的語言。然而&am…

[轉]前端構建工具gulpjs的使用介紹及技巧

本文轉自&#xff1a;http://www.cnblogs.com/2050/p/4198792.html gulpjs是一個前端構建工具&#xff0c;與gruntjs相比&#xff0c;gulpjs無需寫一大堆繁雜的配置參數&#xff0c;API也非常簡單&#xff0c;學習起來很容易&#xff0c;而且gulpjs使用的是nodejs中stream來讀取…

Eclipse側邊欄Outline設置字體

Eclipse的Outline&#xff0c;Project Explorer&#xff0c;Call Hierarchy等小窗口是很方便的功能&#xff0c;但是遇到函數名或文件名很長的情況&#xff0c;就只能顯示前半段。盡管Eclipse的自定義程度很高&#xff0c;但是卻找不到這些窗口的字體設置。 經過一番摸索后&…