[ function ] 函数名(){
命令序列
[return x]
}
函数名 [参数1] [参数2]
$0:是脚本本身的名字;
$#:是传给脚本的参数个数;
$@:是传给脚本的所有参数的列表,即被扩展为"$1" “$2” “$3"等;
$*:是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个,即被扩展成”$1c$2c$3",其中c是IFS的第一个字符;
$$:是脚本运行的当前进程ID号;
$?:是显示最后命令的退出状态,0表示没有错误,其他表示有错误;
通过sum(){}定义函数
使用read命令交互输入两个数并求和
#!/bin/bash
function sum(){
#命令序列
read -p "请输入第一个整数:" num1
read -p "请输入第二个整数:" num2
SUM=$[$sum1+$sum2]
echo "和:$SUM"
#echo返回的是处理结果
echo $SUM
#return返回的是状态码
return 100
}
number=`sum`
echo $?
echo $number
echo返回的时处理结果值return返回的时状态码,调用函数时,若有返回值,通过$?来获取
调用要用命令形式得加反撇号``
函数在shell脚本中仅在当前shell环境中有效
shell脚本中变量默认全局有效
将变量限定在函数内部使用local命令
局部变量,定义在函数中,只在函数内识别,函数外不识别
例:
函数内部变量通过local来实现
参数的用法
函数名称 参数1 参数2 参数3…
参数的表示方法
$1 $2 3......... 3......... 3.........{10} ${11}…
调用自己本身的函数
function sum(){
s=`sum`
}
本质:
从什么时候开始
到什么时候结束
每次递归需要干嘛
#!/bin/sh
factorial=1
for a in `seq 1 10 `
do
factorial=`expr $factorial\*$a`
done
echo "10! = $factorial"
function list_files(){
for f in `ls $1`
do
#判断是否为目录
if [ -d "$1/$f" ];then
echo "$2$f"
#递归调用
list_files "$1/$f" " $2"
else
echo "$2$f"
fi
done
}
list_files "/var/log" ""
相同类型数据的集合
[11,22,33,44]在内存红开辟了连续的空间,配合循环使用
数组名称:arr arr=(11,22,33,44)
数组元素:11
数组长度:4
数组下标:0,1,2,3 (索引 计算机索引基本上都是从0开始)
for 临时变量 in 数组
do
done
方法一
数组名=(value1 value2 value3…)
方法二
数组名=([0]value [1]value [2]value…)
方法三
列表名=“value0 value1 value2…”
数组名=($列表名)
此方法不可以调用单个数据
方法四
数组名[0]=“value”
数组名[1]=“value”
数组名[2]=“value”
可以替换掉其中的某个元素
${数组名[@/*]}
${数组名[下表]}
for v in $(arr[@])
do
echo $v
done
echo命令
bash命令
命令语法
sh [-nvx] 脚本名
常用选项
-n不执行
-v执行
-x关闭
set命令
set -x :开启调解模式
set +x:关闭调节模式
#!/bin/bash
k=0 #元素
j=1 #增量
for ((i=0;i<=99;i++));do
k=$[$i+$j]
let j++
#最大元素不能操作100
if[ $k -le 100 ];then
arr[$i]=$k
fi
done
echo ${arr[*]}
#!/bin/bash
for ((i=0;i<=49;i++));so
arr[$i]=$[2*$i+1]
done
echo ${arr[*]}
#!/bin/bash
for ((i=0;i<=99,i++));do
arr[$i]=$[$i+1]
done
echo ${arr[*]}
#!/bin/bash
i=0 #数组下标
while true //死循环
do
read -p "是否存入元素(yes/no):" doing
if [ $doing == "no" ];then
break
fi
read -p "请存入第$[$i+1]个元素:" key
arr[$i]=$key
let i++
done
echo ${arr[*]}
#!/bin/bash
for ((i=0;;i++));do
read -p "加入元素:" num
if [ -z $num ];then //-z 判断字符串长度是否为0
break
fi
arr[$i]=$[$num]
done
echo ${arr[*]}
#!/bin/bash
#原始数组
score=(72 88 42 55 90)
#遍历数组
for ((i=0;i<${#score[*];i++}));do
#判断是否大于60,未满足60直接赋予60
if [ ${score[$i]} -lt 60 ];then
new[$i]=60
else
new[$i]=${score[$i]}
fi
done
echo ${new[*]}
#!/bin/bash
score=(45 88 67 90 78)
temp=0
for ((i=0;i<${#score[*]};i++));do
if [ ${score[$i]} -gt $temp ];then
temp=${score[$i]}
fi
done
echo $temp
#!/bin/bash
score=(45 88 67 90 78)
#外层为轮
for ((i=1;i<${#score[*]};i++));do
#内层为次
for ((j=0;j<${#score[*]}-i;j++));do
#两数交换
if [ ${score[$j]} -gt ${score[`expr $j + 1`]} ];then
tmp=${score[`expr $j + 1`]}
score[`expr $j + 1`]=${score[$j]}
${score[$j]}=tmp
fi
done
done
echo ${score[*]}
#!/bin/bash
#存入元素
k=0
while true
do
read -p "是否存入元素:" doing
if [ $doing == "no" ];then
break
fi
read -p "请输入第$[$k+1]个元素:" key
score[$k]=$key
let k++
done
#外层为轮
for ((i=1;i<${#score[*]};i++));do
#内层为次
for ((j=0;j<${#score[*]}-i;j++));do
#两数交换
if [ ${score[$j]} -gt ${score[((j+1))]} ];then
tmp=${score[((j+1))]}
score[((j+1))]=${score[$j]}
${score[$j]}=tmp
fi
done
done
echo ${score[*]}