bash编程语法
首先,我们先说下bash语法都有哪些内容,随后我会随后一一去分析,加强我记忆的同时也分享下给家。
linux bash脚本的基本内容构架如下:
#!/bin/bash -----> 每个bash脚本第一行必须要写的,告诉系统这是个bash脚本。
# -----> #为注释的标志符号,#开头的行都是脚本不执行的,仅用作注释
命令段 -----> 脚本要执行的具体命令,来完成相应的功能
bash编程为过程式编程语言,有3种主要语句即为:
顺序执行语句:最简单的,至上而下执行语句,工作模式为:
#!/bin/bash
#(可有可无)
语句1
语句2
先执行语句1,再执行语句2,例如:
创建脚本 bash1.sh
输出结果为:hello !
hao are you
循环执行语句:有3种,for循环,while循环,until循环
基本结构如下:()内的内容就是变量要依次读出的内容,并要放到循环体中去执行的
for 变量 in (列表); do
循环体
done
循环体中的变量依次从列表中读取数据,知道列表中的数据读取完为止,例如:
我们求 1到100之间的所有整数的和为例,
创建脚本 bash2.sh (for循环)
图中,i为变量(bash编程中,变量无需提前定义),对变量取值要用$,如对i取值:$i
但是,我们对于图中的sun变量为什么要定义且赋予值0呢?,因为我们要做累加运算,必须有个初值,比如你要算账的话,必须知道算账之前的账单状态,才能得出结果啊,也就是数据的初始化。
{1..100}表示,1到100的所有整数1,2,3........99,100
输出结果为5050,你可以自己验证下
while循环样例:
while [条件测试]; do
循环体
done
上图中,counter=1,为条件测试的变量counter的初始值,
let counter++ , 为循环体每执行一次,变量counter就自动+1,直到不满足测试条件为止,本题中,变量counter直到大于100,不满足测试条件,循环结束,输出最后结果为5050
until循环:基本格式:
until [条件测试]; do #until的测试条件,为真跳出循环,为假则执行语句(看清楚)
循环体
done
我们依然以1+2+3+.....+99+100为例:
看到图中的测试条件了没有,while循环时,判断为 -ge 意思 小于等于,
until循环时,判断为 -gt 意思 大于,相反,这个从单词意思上就能看的出来,是不是这样啊。
这里我们说到了比较符号,那就补充下吧,
bash编程中测试类型有:
整型测试:整数的比较
基本模式为: [ $变量1 -gt $变量2 ]
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
-ne 等于
-ne 不等于
字符测试:(分为单目和双目)字符串的比较
双目:
>
<
=
>=
<=
单目:
-n String: 是否不空,不空则为真,空则为假
-z String: 是否为空,空则为真,不空则为假
选择语句:简单比放下,你选择
从A开始,选择B,则执行1,选择C,则执行2,
选择语句一般有以下几种,
单分支if语句,
最基本的格式:
if [条件测试];then #里面的【条件测试】如果为真,则执行语句1,为假执行语句2
语句1
fi
case
我们来看下选择语句的样题:
假如:如果我们输入一个整数数a,如果此整数a为偶数,则输出A,其他则退出
如果输入2,则输出 A,输入3,则退出脚本,不显示内容
上图中,让用户输入一个内容,的语句格式为: read -p 提示内容 变量
来判断一个数是否为偶数,我们用取余运算,但是发现了没有,$[$num%2],我在$num%2的前面又加了一个$,意思为,取运算完成后的数值与0进行比较,不加就会出现错误的哦
双分支if语句,
基本格式为:
if [条件测试];then
语句1
else
语句2
fi
条件测试满足即为真时,执行语句1,否则执行语句2
样例:如果我们输入一个整数数a,如果此整数a为偶数,则输出A,否则输出B
上图中,如果你输入的为2,则输出A,输入的为3,则输出B,你可以自己试下,
还有个多分支if语句:
格式为:
if [测试条件1]; then
语句1
elif [测试条件2]; then
语句2
elif [测试条件3]; then
语句3
......
......
else
语句4
fi
意思为,符合测试条件1,执行语句1,符合测试条件2,执行语句2,依次类推。
例如,我们输入一个数,如果输入1,显示A;输入2,显示B;输入3,显示C;输入4,显示D;输入其他内容,则直接退出,并且显示内容,请输入(1|2|3|4),
最后还有个case语句,也输入选择语句的一种:
格式如下:
case 变量 in
条件1)
语句1
;;
条件2)
语句2
;;
条件3)
...
;;
esac
举个例子吧,就用case语法写一下上题那个if选择语句,
结果和if选择样题是一样的,我测试过啦,才发出来的
bash中主要用到的基本内容就如上啦,其中有些,例如逻辑运算,变量的命名以及规则等,没有做详细介绍,有需要的可以问下,学而时习之,不辞下问都懂得。
函数的使用
函数的一般语法
function 函数名(){
函数体
}
可以使用函数名进行函数的调用如:
#!/bin/bash
#
NO1() {
if [ $1 -eq 1 ]; then
echo "A"
fi
}
NO2() {
if [ $1 -eq 2 ]; then
echo "B"
fi
return 0
}
NO3() {
if [ $1 -eq 3 ]; then
echo "C"
fi
return 0
}
NO4() {
if [ $1 -ge 4 ]; then
echo "please input (1|2|3)"
fi
return 1
}
read -p "please input (1|2|3)" num
NO1 $num
NO2 $num
NO3 $num
NO4 $num
上例用了很简单的程序写的。,虽然简单,但基本说明了函数在bash编程中基本使用方式。
函数名 参数:意思为把参数传递给对应的函数,
函数中变量$1:表示接受传递参数的变量
return 0 : 这个表示函数的返回值,每个函数调用执行完成后都会有个返回值的,当然可以自己指定。返回值
bash编程中的数组:
数组是由 数组名+索引构成(索引指向的是数组中的元素)
数组的声明命令为:decalare -a 数组名
数组的赋值:
整体赋值
num=(1 2 3 4 5 6 7 8 9)
单个赋值
num[0]=1
num[1]=2
...
num[8]=9
索引赋值
num=([0]=a [1]=b [2]=c [3]=d)
提示用户对数组进行赋值的语句:
read -a “提示语句” 数组名 ##看清,使用的是-a , 而非-p
遍历数组中的元素
declare -a num
num=(‘ls’) #这里引用ls命令获取的结果赋值给数组num
for i in $[$num[@]]; do
echo $num 输出数组的所有元素
done
数组的长度格式:
${#ARRAY[*]}
${#ARRAY[@]}
从数组中挑选出某个元素的基本格式如下:
${ARRAY[@]:offset:number}
切片:
offset: 偏移的元素个数
number: 取出的元素的个数
${ARRAY[@]:offset}:取出偏移量后的所有元素
${ARRAY[@]}: 取出所有元素
数组的实际运用样例: 生成10个随机数到一个数组中,并排序,
#!/bin/bash
declare -a sum
for i in {1..10}; do
sum[$i]=$RANDOM
done
echo ${sum[@]}
for ((i=0;i<9;i++)); do
for ((j=1;j<$[10-$i];j++)); do
if [ ${sum[$j]} -gt ${sum[$[$j+1]]} ]; then
var=${sum[$j]}
sum[$j]=${sum[$[$j+1]]}
sum[$[$j+1]]=$var
fi
done
done
echo ${sum[@]}
其中用到了生成随机数的命令:
$RANDOM