shell進階變數操作

來源:互聯網
上載者:User
一、內建變數 1.$BASH

Bash的二進位程式檔案的路徑(指令碼解譯器的路徑)

$ vim test.sh

輸入代碼:

#!/bin/bashecho $BASH

運行代碼:

$ bash test.sh
2.$FUNCNAME

當前函數的名字

$ vim test.sh

輸入代碼:

#!/bin/bashxyz23 (){  echo "$FUNCNAME now executing."  # 正常情況下列印: xyz23 now executing.  # 在個別版本的bash中,並不支援$FUNCNAME內建變數}xyz23echo "FUNCNAME = $FUNCNAME"        # FUNCNAME =# 超出函數的範圍就變為null值了.

運行代碼:

$ bash test.sh
3.$IFS

內部域分隔字元,這個變數用來決定 Bash 在解釋字串時如何識別域,或者單詞邊界。

$IFS預設為空白(空格,定位字元,和分行符號),但這是可以修改的,比如,在分析逗號分

隔的資料檔案時,就可以設定為逗號,注意 $* 使用的是儲存在$IFS中的第一個字元。

$ vim test.sh

輸入代碼:

#!/bin/bash# $IFS 處理空白與處理其他字元不同.output_args_one_per_line(){  for arg  do echo "[$arg]"  done}echo; echo "IFS=\" \""echo "-------"IFS=" "var=" a  b c   "output_args_one_per_line $var  # output_args_one_per_line `echo " a  b c   "`## [a]# [b]# [c]echo; echo "IFS=:"echo "-----"IFS=:var=":a::b:c:::"               # 與上邊一樣, 但是用" "替換了":".output_args_one_per_line $var## []# [a]# []# [b]# [c]# []# []# []# 同樣的事情也會發生在awk的"FS"域中.# 感謝, Stephane Chazelas.echoexit 0

注意: 你可能對上面的for迴圈和變數arg有疑問,這將在下一節進行討論。

運行代碼:

$ bash test.sh
4、$REPLY

當沒有參數變數提供給 read 命令的時候,這個變數會作為預設變數提供給 read 命令。也

可以用於 select 菜單,但是只提供所選擇變數的編號,而不是變數本身的值。在個別版本的bash中,並不支援內建變數$REPLY。

$ vim test.sh

輸入代碼:

#!/bin/bash# reply.sh# REPLY是提供給'read'命令的預設變數.echoecho -n "What is your favorite vegetable? "readecho "Your favorite vegetable is $REPLY."#  若且唯若沒有變數提供給"read"命令時,#+ REPLY才儲存最後一個"read"命令讀入的值.echoecho -n "What is your favorite fruit? "read fruitecho "Your favorite fruit is $fruit."echo "but..."echo "Value of \$REPLY is still $REPLY."#  $REPLY還是儲存著上一個read命令的值,#+ 因為變數$fruit被傳入到了這個新的"read"命令中.echoexit 0

運行代碼:

$ bash test.sh
5.通過$*和$@列出所有的參數

"$*" 所有的位置參數都被看作為一個單詞。

$@與 $* 相同,但是每個參數都是一個獨立的引用字串,這就意味著,參數是被完整

傳遞的,並沒有被解釋或擴充。這也意味著,參數列表中每個參數都被看作為單獨的單詞。

$ vim test.sh

輸入代碼:

#!/bin/bash# 多使用幾個參數來調用這個指令碼, 比如"one two three".E_BADARGS=65if [ ! -n "$1" ]thenecho "Usage: `basename $0` argument1 argument2 etc."exit $E_BADARGSfi  echoindex=1          # 起始計數.echo "Listing args with \"\$*\":"for arg in "$*"  # 如果"$*"不被""(雙引號)引用,那麼將不能正常地工作.doecho "Arg #$index = $arg"let "index+=1"done             # $* 將所有的參數看成一個單詞.echo "Entire arg list seen as single word."echoindex=1          # 重設計數(譯者注: 從1開始).echo "Listing args with \"\$@\":"for arg in "$@"doecho "Arg #$index = $arg"let "index+=1"done             # $@ 把每個參數都看成是單獨的單詞.echo "Arg list seen as separate words."echoindex=1          # 重設計數(譯者注: 從1開始).echo "Listing args with \$* (unquoted):"for arg in $*doecho "Arg #$index = $arg"let "index+=1"done             # 未引用的$*將會把參數看成單獨的單詞.echo "Arg list seen as separate words."exit 0

運行代碼:

$ bash test.sh
二、操作字串 1.字串長度
$ vim test.sh

輸入代碼:

#!/bin/bashstringZ=abcABC123ABCabcecho ${#stringZ}                 # 15expr length $stringZ             # 15

運行代碼:

$ bash test.sh
2.使用awk來處理字串

Bash指令碼也可以調用awk的字串操作功能來代替它自己內建的字串操作。

例子:提取字串

$ vim test.sh

輸入代碼:

#!/bin/bashString=23skidoo1#      012345678    Bash#      123456789    awk# 注意不同的字串索引系統:# Bash的第一個字元是從'0'開始記錄的.# Awk的第一個字元是從'1'開始記錄的.echo ${String:2:4} # 位置 3 (0-1-2), 4 個字元長# skid# awk中等價於${string:pos:length}的命令是substr(string,pos,length).echo | awk '{    print substr("'"${String}"'",3,4)      # skid}'#  使用一個空的"echo"通過管道傳遞給awk一個假的輸入,#+ 這樣就不必提供一個檔案名稱給awk.exit 0

運行代碼:

$ bash test.sh
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.