bash腳本函數和數組

    函數function是由若干條shell命令組成的語句塊,實現代碼重用和模塊化編程。它與shell程序形式上是相似的,不同的是它不是一個單獨的進程,不能獨立運行,而是shell程序的一部分。
    函數和shell程序比較相似,區別在于:
    (1)Shell程序在子Shell中運行。
    (2)而Shell函數在當前Shell中運行。因此在當前Shell中,函數可以對shell中變量進行修改。

    注意:必須在調用函數地方之前,聲明函數,shell腳本是逐行運行。函數的生命周期;每次被調用時創建,返回時終止

        1) 定義函數的代碼段不會自動執行,在調用時執行;所謂調用函數,在代碼中給定函數名即可;

        2) 函數名出現的任何位置,在代碼執行時,都會被自動替換為函數代碼;



=========================================================

定義函數的格式

函數名()
{
命令1
. . .
}
或者
函數名(){
命令1
. . .
}
==========================================================

兩者方式都可行。如果愿意,可在函數名前加上關鍵字f u n c t i o n,這取決于使用者。
f u n c t i o n 函數名()
{ …
}
可以將函數看作是腳本中的一段代碼,但是有一個主要區別。執行函數時,它保留當前
s h e l l和內存信息。此外如果執行或調用一個腳本文件中的另一段代碼,將創建一個單獨的
s h e l l,因而去除所有原腳本中定義的存在變量。


在腳本中定義函數

hello(){
    echo "hello  today is `date`"
}

在腳本中使用函數

#!/bin/bash
#
#
hello(){
	echo "hello  today is `date`"
}
echo "the is call function"
hello
echo "call function finish"

執行結果

the is call function
hello  today is 2016年 08月 22日 星期一 09:44:22 CST
call function finish

函數返回值:

函數的執行結果返回值:

    (1)使用echo或者printf命令進行輸出;

    (2)函數體中調用的命令的執行結果;

函數的退出狀態碼:

    (1)默認取決于函數體中執行的最后一條命令的退出狀態碼;

    (2)自定義:return


傳遞參數給函數;

在函數體中,可以使用$1,$2…引用傳遞給函數的參數;還可以在函數中使用$*或$@引用所有參數,$#引用傳遞的參數的個數;

在調用函數時,在函數名后面以空白符分割給定參數列表即可,例如, testfunc arg1 agr2 arg3…

#!/bin/bash
#
# return 1: user exists
[ $# -lt 1 ] && echo "enter noe username" && exit 1
adduser(){
	if id $1 &> /dev/null;then
		return 1
	else
		useradd $1
		retval=$?
		return $retval
	fi
}

for i in {1..100};do
	adduser ${1}${i}
	retval=$?
	if [ $retval -eq 0 ];then
		echo "add user ${1}${i} finished"
	elif
		[ $retval -eq 1 ];then
		echo "user ${1}${i} exists"
	else
		echo "unkown error"
	fi
done

變量作用域:

局部變量:作用域是函數的生命周期;在函數結束時被自動銷毀

定義局部變量的方法;local variable=value

本地變量:作用域是運行腳本的shell進程的生命周期;因此,其作用范圍為當前shell腳本進程

#!/bin/bash
#
#
name=tom

setname(){
	local name=jerry
	echo "function:$name"

}
setname
echo "shell: $name"

    如果不使用local就會出現如下情況

#!/bin/bash
#
#
name=tom

setname(){
	 name=jerry
	echo "function:$name"

}
setname
echo "shell: $name"

執行結果

function:jerry
shell: jerry



數組

數組:

數組:存儲多個元素的連續的內存空間;

數組名:整個數組只有一個名字;

數組索引:編號從0開始

引用方式:數組名【索引】

${array_name[index]}

注意:bash-4及之后的版本,支持自定義索引格式,而不僅僅是0.12,…數字格式

此類數組稱之為“關聯數組”

聲明數組:

declare -a NAME:聲明索引數組;

declare -A NAME:聲明關聯數組:(必須先聲明,再使用)

數組中元素的賦值方式:

(1)一次只賦值一個元素

ARRY_NAME[index]=value

]#name[0]=ali
]#echo $name
ali

(2)一次賦值全部元素;

arry_name=("val1" "val2" "val3"….)

]#name=(ali Aisha mohamed)
]#echo ${name[*]}
ali Aisha mohamed

(3)只賦值特定元素;

arry_name=([0]="val1" [3]="val4"…)

]#name=([0]=ali [3]=mohamed)
]#echo ${name[*]}
ali mohamed

注意:bash支持稀疏格式的數組

(4)read -a arry_name

]#read -a name
Aisha ali mohamed
]#echo ${name[*]}
Aisha ali mohamed

引用數組中的元素:${arry_name[index]}

注意:引用時,只給數組名,表示下標為0的元素

]#echo ${name}
Aisha

${arry_name[*]}:引用數組中的所有元素

${arry_name[@]}:

]#echo ${name[*]}
Aisha ali mohamed

數組的長度(數組中的元素的個數);

${#arry_name[*]}

${#arry_name[@]}

]#echo ${#name[*]}
3

數組元素切片:${arry_name[@]:offset:number}

offset:要跳過的元素個數;

number:要取出的元素個數;省略number時,表示取偏移量之后的所有元素;

向非稀疏格式數組中追加元素

arry_name[${#arry_name[*]}]=

刪除數組中的某元素

unset arry[index]

關聯數組;

declare -A arry_name

arry_name=([index_name1]="value1" [index_name2]="value2"…)



原創文章,作者:M20-1馬星,如若轉載,請注明出處:http://www.www58058.com/38783

(0)
M20-1馬星M20-1馬星
上一篇 2016-08-24
下一篇 2016-08-24

相關推薦

  • (總結)MySQL自帶的性能壓力測試工具mysqlslap詳解

    PS:今天一同事問我有木有比較靠譜的mysql壓力測試工具可用。其實mysql自帶就有一個叫mysqlslap的壓力測試工具,還是模擬的不錯的。下面舉例說說。mysqlslap是從5.1.4版開始的一個MySQL官方提供的壓力測試工具。通過模擬多個并發客戶端訪問MySQL來執行壓力測試,同時詳細的提供了“高負荷攻擊MySQL”的數據性能報告。并且能很好的對比…

    Linux干貨 2015-02-10
  • 編譯安裝Apache

    實驗環境:CentOS 6 安裝包版本:httpd-2.2.29.tar.bz2 一、安裝前準備     (1)、獲取httpd-2.2.29.tar.bz2安裝包     (2)、準備開發工具,安裝相應的包組 yum groupinstall -y&nbsp…

    Linux干貨 2016-08-24
  • 系統管理之網絡管理

    今天給大家分享一些網絡方面的知識,,這塊的知識很重要哦,都是涉及網絡最底層的鏈路和協議,是我們學習大型服務的基礎,和前提.希望大家努力理解這方面的內容,今天的內容大概有這幾方面: 1.計算機網絡概念 2.計算機網絡體系結構 3.物理層 4.數據鏈路層 5.網絡層 6.IP地址及子網 7.傳輸層 8.應用層 計算機網絡概念 計算機網絡是個發展中的概念和技術,具…

    Linux干貨 2016-09-05
  • N22-第七周作業

    1、創建一個10G分區,并格式為ext4文件系統;    (1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl;    (2) 掛載至/data/mydata目錄,要求掛載時禁止程序自動運行,且不更新文件的訪問時間戳; [root@localhost ~]# fd…

    Linux干貨 2016-10-07
  • 推薦-File System manager

    文件系統(File system) :     文件系統概要    文件系統的分類    文件系統的管理工具             mkfs btrfs ext xfs&nbsp…

    Linux干貨 2016-03-26
  • [轉]百萬級訪問網站前期的技術準備

       [轉]百萬級訪問網站前期的技術準備 開了自己域名的博客,第一篇就得來個重磅一點的才對得起這4美金的域名。作為一個技術從業者十年,逛了十年發現有些知識東一榔頭西一棒槌的得滿世界  看個遍才整理出個頭緒,那咱就系統點的從頭一步一步的說,一個從日幾千訪問的小小網站,到日訪問一兩百萬的小網站,怎么才能讓它平滑的度過這個階段,別在 …

    Linux干貨 2016-10-29
欧美性久久久久