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...调用这些参数;还可以使用[email protected],$*,$#等特殊变量
#!/bin/bash
#
declare -i i=6
f1(){
local i=9 #函数内的局部变量
let i++
echo "Function:$i"
}
f1
echo "Main:$i"
函数递归:
函数直接或间接调用自身:
求阶乘
#!/bin/bash
#
fact() {
if [ $1 -eq 0 -o $1 -eq 1 ];then
echo 1
else
echo $[$1*$(fact $[$1-1])]
fi
}
fact $1
裴波那契数列
#!/bin/bash
#
fab(){
if [ $1 -eq 1 ]; then
echo 1
elif [ $1 -eq 2 ];then
echo 2
else
echo $[$(fab $[$1-1])+$(fab $[$1-2])]
fi
}
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个随机数,并找出最大值;
#!/bin/bash
#
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]}
done
echo "Max: $max"
写一个脚本,定义一个数组,数组中的元素是/var/log目录下所有以.log结尾的文件:统计其下标为偶数的文件中的行数之和;
#!/bin/bash
#
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 )
fi
done
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