最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Shell中關(guān)于處理方法返回值問(wèn)題詳解

 更新時(shí)間:2017年12月17日 11:08:19   作者:小文字  
最近工作接觸到了一些Linux上面的文本處理,數(shù)據(jù)量還是蠻大的,不可避免的學(xué)期了shell,awk等腳本語(yǔ)言。下面這篇文章主要給大家介紹了關(guān)于Shell中關(guān)于處理方法返回值問(wèn)題的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。

背景

如今,不會(huì)Linux的程序員都不意思說(shuō)自己是程序員,而不會(huì)shell編程就不能說(shuō)自己會(huì)Linux。通過(guò)shell編程,寫(xiě)一些工具批處理的時(shí)候,經(jīng)常需要自定義函數(shù)。更復(fù)雜點(diǎn)的情況下,可能有需要返回一個(gè)值。

由于在shell的世界中,并不像其他編程語(yǔ)言,它不支持我們所熟悉的方法返回。本文一起總結(jié)一下如何優(yōu)雅的解決返回值問(wèn)題?

測(cè)試程序

我們一般通過(guò)$?來(lái)獲取上一個(gè)語(yǔ)句的輸出。看一下下面得測(cè)試語(yǔ)句:

新建testReturn腳本

returnString(){
 return $1
}
returnString $1
result=$?
echo "result=$result"

現(xiàn)在我們有一個(gè)testReturn的腳本,里面有一個(gè)returnString的方法,我們希望它能夠直接返回我們輸入的參數(shù)。
當(dāng)我們分別以hello,500,12作為輸入?yún)?shù)時(shí),他的執(zhí)行和輸出情況是一樣的么?

./testReturn hello
./testReturn 500
./testReturn 12

在心中試著猜一下可能的情況,現(xiàn)在我們來(lái)揭曉答案:

程序輸出情況

在執(zhí)行hello的時(shí)候,并沒(méi)有輸出hello,而是報(bào)了一個(gè)return只接受數(shù)字類(lèi)型的錯(cuò)誤

aven-mac-pro-2:avenwu.github.io aven$ ./testReturn hello
./testReturn: line 23: return: hello: numeric argument required
result=255

在執(zhí)行500的時(shí)候,頁(yè)沒(méi)有輸出500,而是輸出了244

aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 500
result=244

執(zhí)行12的時(shí)候,終于正確了,返回12

aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 12
result=12

異常分析

現(xiàn)在我們分析一下returnString這個(gè)方法,為什么會(huì)有這么多種輸出情況呢?

首先他的寫(xiě)法顯然是不嚴(yán)謹(jǐn)?shù)?,但也不是完全錯(cuò)誤,比如輸入12他就正確返回了。

return本身是shell里面的buildin函數(shù),筆者總結(jié)了下,他有以下幾個(gè)特征:

  • return可以返回?cái)?shù)字狀態(tài),常常用于返回0,1,標(biāo)識(shí)一個(gè)函數(shù)執(zhí)行后是否成功
  • 注意return不可以返回非數(shù)字類(lèi)型
  • 同時(shí)數(shù)字類(lèi)型也有可能發(fā)生溢出現(xiàn)象

全局變量

如果我們就是要返回一個(gè)字符串,怎么辦呢?可以通過(guò)定義全局變量來(lái)進(jìn)行賦值,類(lèi)似于靜態(tài)變量/成員變量的寫(xiě)法,我們讓他的作用域穿透整個(gè)上下文。

result=""
returnString(){
 result=$1
}
returnString $1
echo "result=$result"

再看一下輸出,得到了我們需要的結(jié)果:

aven-mac-pro-2:avenwu.github.io aven$ ./testReturn hello
result=hello
aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 500
result=500
aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 12
result=12

但是這樣寫(xiě),會(huì)污染全局變量,并且result這個(gè)變量很容易在內(nèi)部和外部都被修改,導(dǎo)致內(nèi)部修改失效。

eval

除了return,還有其他一些buildin的關(guān)鍵字,比如eval,local。

默認(rèn)在當(dāng)前腳本定義的變量都是全局變量,在方法中則可以通過(guò)local來(lái)定義局部變量,這樣可以避免全局變量污染.
同時(shí)結(jié)合eval賦值語(yǔ)句,來(lái)實(shí)現(xiàn)變量的修改

returnString(){
 local __result=$2
 eval $__result=$1
}
returnString $1 result
echo "result=$result"

同樣我們也得到了希望的結(jié)果

aven-mac-pro-2:avenwu.github.io aven$ ./testReturn hello
result=hello
aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 500
result=500
aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 12
result=12

echo

最后在介紹一種方法,通過(guò)echo輸出,結(jié)合command substitution。

這個(gè)command substitution也沒(méi)有找到比較合適的翻譯,姑且按字面意思翻譯命令替換。

如果你的方法內(nèi)部只有一處echo輸出,那么也可以利用她來(lái)進(jìn)行值得返回,不過(guò)這個(gè)就有點(diǎn)局限性,一定要確保方法內(nèi)只有一次輸出,否則就會(huì)出現(xiàn)賦值內(nèi)容過(guò)多。

returnString(){
 local __result=$1
 echo $__result
}
# 或者 result=`returnString $1`
result=$(returnString $1)
echo "result=$result"

同樣可以得到預(yù)期結(jié)果

aven-mac-pro-2:avenwu.github.io aven$ ./testReturn hello
result=hello
aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 500
result=500
aven-mac-pro-2:avenwu.github.io aven$ ./testReturn 12
result=12

越界問(wèn)題

現(xiàn)在我們已經(jīng)有幾種辦法可以返回字符串了,那么return返回?cái)?shù)字有時(shí)候正確,有時(shí)候又不正確是為什么呢?

我們知道return原本就是用于返回執(zhí)行狀態(tài)的,比如0,1.那么我們?cè)诜祷?00的時(shí)候,實(shí)際上是數(shù)據(jù)溢出了。

根據(jù)測(cè)試,我們推斷shell的內(nèi)置return承接返回值用的是一個(gè)字節(jié)的大小,也就是8位,最多可以輸出無(wú)符號(hào)0-255的整形,范圍之外的數(shù)據(jù)全部溢出顯示。因此在使用return的時(shí)候,務(wù)必留意數(shù)值大小。

小結(jié)

通過(guò)shell命令可以很方便的寫(xiě)出一些小腳本,但是如果遇到邏輯復(fù)雜,建議通過(guò)其他更合適的預(yù)覽來(lái)實(shí)現(xiàn),比如Python,Golang之類(lèi)。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 使用SHC對(duì)Shell腳本進(jìn)行封裝和源碼隱藏的方法

    使用SHC對(duì)Shell腳本進(jìn)行封裝和源碼隱藏的方法

    shc是一個(gè)由C語(yǔ)言編寫(xiě)的Shell腳本加密程序,它可以將你的腳本編譯成二進(jìn)制可執(zhí)行文件,從而隱藏源碼,這篇文章主要介紹了如何使用SHC對(duì)Shell腳本進(jìn)行封裝和源碼隱藏,需要的朋友可以參考下
    2023-10-10
  • Linux?shell中改文件名的方法總結(jié)

    Linux?shell中改文件名的方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于Linux?shell中改文件名的方法,在Shell中有多種方法可以來(lái)修改文件名,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • 使用shell腳本對(duì)Nginx日志進(jìn)行切分的示例代碼

    使用shell腳本對(duì)Nginx日志進(jìn)行切分的示例代碼

    本篇文章主要介紹了使用shell腳本對(duì)Nginx日志進(jìn)行切分的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • Shell內(nèi)置命令之exit的語(yǔ)法與實(shí)例

    Shell內(nèi)置命令之exit的語(yǔ)法與實(shí)例

    系統(tǒng)中是有exit命令的,用于退出當(dāng)前用戶的登錄狀態(tài),但是在?Shell?腳本中,exit?語(yǔ)句是用來(lái)退出當(dāng)前腳本的,下面這篇文章主要給大家介紹了關(guān)于Shell內(nèi)置命令之exit的語(yǔ)法與實(shí)例,需要的朋友可以參考下
    2022-03-03
  • Shell腳本編程中常用的數(shù)學(xué)運(yùn)算實(shí)例

    Shell腳本編程中常用的數(shù)學(xué)運(yùn)算實(shí)例

    這篇文章主要介紹了Shell腳本編程中常用的數(shù)學(xué)運(yùn)算實(shí)例,包含最基本的加減乘除,還有質(zhì)數(shù)、偶數(shù)的判斷等,需要的朋友可以參考下
    2014-06-06
  • Linux環(huán)境下tcpdump網(wǎng)絡(luò)協(xié)議抓包與解析

    Linux環(huán)境下tcpdump網(wǎng)絡(luò)協(xié)議抓包與解析

    這篇文章主要為大家介紹了Linux環(huán)境下tcpdump網(wǎng)絡(luò)協(xié)議抓包與解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • 使用Bash腳本自動(dòng)化清理Nacos日志文件的實(shí)現(xiàn)方法

    使用Bash腳本自動(dòng)化清理Nacos日志文件的實(shí)現(xiàn)方法

    在現(xiàn)代的分布式系統(tǒng)中,Nacos作為服務(wù)發(fā)現(xiàn)、配置管理和動(dòng)態(tài)服務(wù)管理的核心組件,其日志文件的管理顯得尤為重要,隨著系統(tǒng)的運(yùn)行,日志文件會(huì)不斷累積,占用大量磁盤(pán)空間,本文將介紹如何通過(guò)一個(gè)簡(jiǎn)單的 Bash 腳本自動(dòng)化清理 Nacos 的日志文件,需要的朋友可以參考下
    2025-04-04
  • Shell實(shí)現(xiàn)的iptables管理腳本分享

    Shell實(shí)現(xiàn)的iptables管理腳本分享

    這篇文章主要介紹了Shell實(shí)現(xiàn)的iptables管理腳本分享,本文腳本實(shí)現(xiàn)了添加、刪除、查看、停止、啟動(dòng)等,需要的朋友可以參考下
    2014-12-12
  • linux find命令之xargs簡(jiǎn)單概述

    linux find命令之xargs簡(jiǎn)單概述

    這篇文章主要為大家詳細(xì)介紹了linux find命令之xargs的簡(jiǎn)單使用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Linux中使用expect腳本實(shí)現(xiàn)遠(yuǎn)程機(jī)器自動(dòng)登錄

    Linux中使用expect腳本實(shí)現(xiàn)遠(yuǎn)程機(jī)器自動(dòng)登錄

    本篇文章給大家介紹在Linux中使用expect腳本實(shí)現(xiàn)遠(yuǎn)程機(jī)器自動(dòng)登錄,前提是要?jiǎng)?chuàng)建一個(gè)expec腳本ssh_expect,接下來(lái)定義一些命令別名等,下面跟著腳本之家小編一起學(xué)習(xí)學(xué)習(xí)吧
    2015-09-09

最新評(píng)論

且末县| 越西县| 拜城县| 名山县| 贵溪市| 吴堡县| 辽源市| 富裕县| 常熟市| 张家口市| 阿图什市| 隆林| 睢宁县| 枣强县| 武山县| 宜兴市| 德清县| 孟州市| 泰安市| 封丘县| 建阳市| 行唐县| 阿坝| 临高县| 纳雍县| 息烽县| 新建县| 潼关县| 桐梓县| 河曲县| 全州县| 通山县| 顺平县| 辽宁省| 盐源县| 万荣县| 平度市| 临高县| 靖州| 澄迈县| 乡城县|