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 21:22
下一篇 2016-08-24 21:22

相關推薦

  • N26第一周作業

    第一周作業   1. 描述計算機的組成及其功能。   計算機主要由處理器(CPU)、存儲器、輸入設備、輸出設備。 CPU由運算器、控制器、寄存器、緩存器組成,提供運算。 存儲器即內存,RAM(Random Access Memory),內存為cpu運算時提供數據存儲。 Input:用戶下指令的設備,使計算機能夠與用戶進行交互。 Outpu…

    Linux干貨 2017-01-03
  • 馬哥教育網絡班20期+第六周課程練習

    請詳細總結vim編輯器的使用并完成以下練習題 1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#;     cp /etc/rc.d/rc.sysinit  /tmp   &n…

    Linux干貨 2016-10-19
  • find—查找條件

    find—查找條件    目 錄 一、根據時間戳查找: 二、根據權限查找 三、根據文件所屬人owner,文件所屬組group查找 四、根據搜索層級查找 五、根據文件名查找 六、根據文件類型查找    find實時查找工具,通過遍歷指定路徑完成文件查找 (1)工作特點: 查找速度略慢 精確查找 實時查找 可以只…

    Linux干貨 2017-08-13
  • linux系統啟動流程詳解

    一、 為什么要研究linux系統啟動:     或許有人會說,等它開機就好了,為什么還要研究它開機流程呢,其實如果服務器運行很好又沒有人為的誤操作等,或許不用研究,但是為了能在系統出問題后第一時間的修復它,又或者你忘記了root密碼等情況時就非常有必要研究一下linux的開機流程了,因為只有知道了它是如何運作的,才能讓…

    Linux干貨 2016-09-13
  • Linux基礎知識(二)

    一、Linux文件管理類命令的使用方法及其相關示例演示? 1、文件管理 (1)mkdir (2)rmdir (3)cp (4)mv (5)rm (6)touch 2、文件查看 (1)ls (2)tree (3)cat&tac (4)head (5)tail (6)more&less (7)stat 二、Bash特性詳解 1、命令行展開 (1)…

    Linux干貨 2016-09-27
  • http2

    練習:     (1)基于主機名實現三個虛擬主機     (2) 每虛擬主機使用獨立的訪問日志和錯誤日志     (3) 第三個虛擬主機的/admin要進行用戶訪問認證     (4) 在第二個虛擬主…

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