天天看點

function-array--字元串截取--mktemp--install

function:函數

過程式程式設計;代碼重用

子產品化程式設計

結構化程式設計

文法一:

funcion f_name{

函數體

}

文法二:

f_name (){

調用:函數隻有被調用才會執行:

函數的生命周期;被調用時建立,傳回時終止

return指令傳回自定義狀态結果:

0;成功

1-255;失敗

#!/bin/bash

#

function adduser {

if id $username &> /dev/null ;then

echo "$username exists."

return 1

else

useradd $username

[ $? -eq 0 ] && echo "ADD $username finished." && return 0

fi

for i in {1..10};do

username=myuser$i

adduser

done

函數可以接受參數:

傳遞參數給函數:調用函數時,在函數後面以空白分隔給定參數清單:例如“testfunc arg1 arg2.。”

在函數體重可以$1 ,$2...調用這些參數;還可以使用$@,$*,$#等特殊變量

declare -i i=6

f1(){

local i=9 #函數内的局部變量

let i++

echo "Function:$i"

f1

echo "Main:$i"

函數遞歸:

函數直接或間接調用自身:

求階乘

fact() {

if [ $1 -eq 0 -o $1 -eq 1 ];then

echo 1

echo $[$1*$(fact $[$1-1])]

fact $1

裴波那契數列

fab(){

if [ $1 -eq 1 ]; then

elif [ $1 -eq 2 ];then

echo 2

echo $[$(fab $[$1-1])+$(fab $[$1-2])]

fab $1

bash腳本程式設計:

變量:存儲單個元素的記憶體空間

數組:存儲多個元素的連續的記憶體空間;

數組名:

索引:編号從0開始,屬于數值索引:

注意:索引也可以支援使用自定義的格式,而不僅僅是數值格式。

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

聲明數組:

declare -a array_name

declare -A array_name:關聯數組:kv

數組元素的指派;

 (1)一次隻指派一個元素;

ARRAY_NAME [INDEX]=VALUE

weekdays[0]="Sunday"

weekdays[4]="Thursday"

 (2)一次指派全部元素:

ARRAY_NAME=(“VAL1”"VAL2""VAL3"...)

 (3)隻指派特定的元素:

ARRAY_NAME=([0]="VAL1" [3]="VAL2"...)

 (4)read -a ARRAY

引用數組中的元素:${array_name[in]}

  注意:省略[index]表示引用下标為0的元素;

數組的長度:${#ARRAY_NAME[*]},${#ARRAY_NAME[@]}

生成10個随機數,并找出最大值;

declare -a rand

declare -i max=0

for i in {0..9};do

rand[$i]=$RANDOM

echo ${rand[$i]}

[ ${rand[$i]} -gt $max ] && max=${rand[$i]}

echo "Max: $max"

寫一個腳本,定義一個數組,數組中的元素是/var/log目錄下所有以.log結尾的檔案:統計其下标為偶數的檔案中的行數之和;

declare -a files

files=(/var/log/*.log)

declare -i lines=0

for i in $(seq 0 $[${#files[*]}-1]); do

if [ $[$i%2] -eq 0 ];then

let lines+=$(wc -l ${files[$i]} | cut -d' ' -f1 )

echo "lines:$lines."

引用數組中的元素;

所有元素:${array_name[*]},${array_name[@]}

${ARRAY[@]:offset:number}

offset:要跳過個的元素個數

number:要取出的元素個數,取偏移量之後的所有元素 ${ARRAY[@]:offset}

向數組中追加元素;

ARRAY[${#ARRAY[*]}]

删除數組中的某個元素;

unset ARRAY[INDEX]

關聯數組;

declare -A ARRAY_NAME

ARRAY_NAME=([index_name1]='val1' [index_name2]='val2'.... )

bash的字元串處理工具;

字元串切片:${var:offset:number}

name="obkjl"

echo ${name:1:3}

echo ${name:1}

echo ${name: -3} 冒号後面必須有個空格,表示從右側開始取

基于模式取子串;

從左到右

${var#*word}:第一次比對到word之後的部分,之前部分删除

${var##*word}:最後一次比對到word.之前的部分删除

從右到左

${var%word*}

file="/etc/httpd/conf/httpd.conf"

echo ${file%/*}

${var%%word*}

查找替換;

${var/pattern/substi}:查找var中,第一次出現pattern所比對的字元串,用substi替換

${var//pattern/substi}:查找var中,所有出現pattern所比對的字元串,用substi替換

${var/#pattern/substi}:查找var中,行首出現pattern所比對的字元串,用substi替換

${var/%pattern/substi}:查找var中,行尾出現pattern所比對的字元串,用substi替換

查找并删除:沒有寫明替換内容substi,則為删除操作

${var/pattern}:查找var中,删除第一次出現pattern所比對的字元串

${var//pattern}

${var/#pattern}

${var/%pattern}

字元大小寫轉換;

${var^^}把var中所有的小寫轉換為大寫

${var,,}把var中所有的大寫轉換為小寫

變量指派:

${var:-value}:如果var為空或者未設定,那麼傳回value;否則傳回var的值

${var:=value}:如果var為空或者未設定,那麼傳回value;并将values指派給var,否則,則傳回var的值

${var:+value}:如果var不空,則傳回value;

${var:?error_info}:如果var為空或者未設定,傳回err_info:否則,傳回var的值;

在腳本中讀取配置檔案

定義文本檔案,每行定義“name=value”

在腳本中source此檔案即可

指令:

mktemp指令:建立臨時檔案

mktemp /tmp/test.xxx

tmpfile=${mktemp /tmp/test.XXX}:引用

mktemp -d /tmp/test.xxx 建立臨時目錄

--tmpdir

=/path/to/somedir:指明臨時檔案路徑

install指令

install [OPTION]... [-T] SOURCE DEST

install [OPTION]... SOURCE... DIRECTORY

install [OPTION]... -t DIRECTORY SOURCE...

install [OPTION]... -d DIRECTORY...

install可以在複制的同時指定權限,屬主,組等

-m mode

-o owner

-g group

     本文轉自阿倫艾弗森 51CTO部落格,原文連結:http://blog.51cto.com/perper/1955405,如需轉載請自行聯系原作者