bash脚本编程的基本知识
1、bash脚本是什么文件,bash脚本是怎么运行的?
答:bash脚本是个shell脚本文本,shell脚本是文本文件,内核不能让其直接运行,但是当内核读取脚本文件的第一行,发现是一个脚本文件,并定义了用来解释执行脚本的bash的脚本程序,然后内核启动一个bash进程用来解释执行这个脚本。这就说明bash脚本是由bash程序解释执行的。
2、bash为什么能解释执行bash脚本?
答:bash能够提供一些内部命令,并且能通过PATH环境变量找到外部命令,把命令提交给内核启动为进程。
3、bash是哪种类型的编程语言?流程控制语句由哪些?
答:bash是面向过程的编程语言,流程控制语句有:顺序执行、循环执行、选择执行。
4、bash编程的基本元素有哪些?
变量:
局部变量:作用域通常是某个代码片段,声明变量时,在前面添加local关键字, 并且只能应用在函数里面,其作用域只是在当前函数块,及其子函数内可见。
本地变量:本地变量也成为全局变量,其作用范围是整个脚本。
环境变量:Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个专用的运行环境。通常每个用户默认的环境都是相同的,这个默认环境实际上就是一组变量的定义,因此这些变量称之为环境变量。
位置参数变量:位置参数变量是为了解决,用户向脚本传递参数设定的,$1表示的是用户向脚本传递的第一个参数、$2表示的是用户向脚本传递的第二个参数,以此类推。
特殊变量:是代表一些特殊含义的变量:$0表示获取当前运行脚本名;$#表示向脚本传递参数的个数,$*表示脚本的参数列表。
流程:
-
顺序执行:从第一条语句向下执行。
循环执行:重复执行一段代码,满足特定条件不执行。
选择执行:通过条件判断,选择执行某一代码。
函数:
-
函数的作用是使代码重用,实现模块化编程,是脚本代码的结构清晰。
数组:
-
数组是连续的多个独立内存空间,每个内存空间相当于一个变量。
算术运算格式:
-
$[ 运算表达式 ] 例如: sum=$[ $sum+$i ]
let 变量名=运算表达式 例如:let sum=$sum+$i
$((运算表达式)) 例如:sum=$(($sum+$i))
$(expr 变量1 变量2 变量3)
5、bash脚本的编写格式?
答:第一行:必须顶格声明解释器;#!/bin/bash。注释行:所有以#开头的行均为注释行;会被解释器忽略。
实例:编写一个脚本,每5秒,检测某个用户是否登录,用户登录就输出信息并推出脚本。
vim who.sh
#!/bin/bash#*****************************************************************************************# Check user login System *# zouhg 2014-12-3 *#*****************************************************************************************#*****************************************************************************************# Mian function code *#*****************************************************************************************read -p "Please enter a username:" usernamewhile ! who |grep "^$username";do sleep 5doneecho "$username logined system!"
6、脚本有哪些执行方式?
答:方法一:赋予脚本执行权限,指明路径执行
实例:赋予脚本执行权限:chmod +x who.sh
执行脚本:./who.sh
方法二:用bash程序解释执行;就是直接传递脚本给bash解释器
实例:检测脚本语法是否有错误:bash -n who.sh
使用bash程序解释执行脚本:bash who.sh
调试运行脚本:bash -x who.sh
7、bash流程控制之循环执行:for、while、until
for循环的详细讲解:
for 变量名 in 列表;do
循环体
done
for循环结构解析:每次循环都是将列表中的元素的值赋值给变量,循环的次数是列表中的元素的个数;列表是至少包含一个元素的字符串集合。
列表的获取方式:(1)直接给出;
(2)数值列表:{起始值..结束值} 例如:{1..10}
$(seq 结束值) 例如:$(seq 10)
$(seq 起始值 结束值) 例如:$(seq 1 10)
$(seq 起始值 步长 结束值) 例如:$(seq 1 2 10)
($3)使用命令替换获取列表:$(命令)
实例:添加三个用户user1,user2,user3;密码同用户名:
vim useradd.sh
#!/bin/bash#*****************************************************************************************# Check user login System *# zouhg 2014-12-3 *#*****************************************************************************************#*****************************************************************************************# Mian function code *#*****************************************************************************************for i in {1..3};do useradd user$1 echo user$1 |passwd --stdin user$1done
for的C编程风格格式:
for ((变量赋值;循环条件;修正表达式));do
循环体
done
实例:探测192.168.1.0内的所有主机,是否在线。
vim pingC.sh
#!/bin/bash#*****************************************************************************************# Check user login System *# zouhg 2014-12-3 *#*****************************************************************************************#*****************************************************************************************# Mian function code *#*****************************************************************************************for ((i=1;1<255;i++));do ping -t1 -w1 192.168.1.$idone
for循环支持嵌套格式:
for i in list1 ;do
执行体1
for j in list2 ;do
执行体2
done
done
实例:探测172.16.0.0内的所有主机,是否在线。
vim pingB.sh
#!/bin/bash#*****************************************************************************************# Check user login System *# zouhg 2014-12-3 *#*****************************************************************************************#*****************************************************************************************# Mian function code *#*****************************************************************************************for i in {0..255};do for j in {1..254};do ping -t1 -w1 172.16.$i.$j donedone
while循环的详细讲解:
while 条件表达式 ;do
循环体
循环控制变量的修正表达式
done
while循环结构解析:当条件表达式为真时,执行循环体和循环控制变量的修正表达式;当条件表达式为假时退出循环
实例:统计1-100正整数之和
#!/bin/bash#*****************************************************************************************# Check user login System *# zouhg 2014-12-3 *#*****************************************************************************************#*****************************************************************************************# Mian function code *#*****************************************************************************************declare -i sum=0declare -i i=1while [ $i -le 100 ];do sum=$[$sum+$i] let i++doneecho "1-100 sum is: $sum"
while循环的详细讲解:
nutil 条件表达式 ;do
循环体
循环控制变量的修正表达式
done
until循环结构解析:当条件表达式为假时,执行循环体和循环控制变量的修正表达式;当条件为真时退出循环
实例:使用until循环统计1-100正整数之和
#!/bin/bash#*****************************************************************************************# Check user login System *# zouhg 2014-12-3 *#*****************************************************************************************#*****************************************************************************************# Mian function code *#*****************************************************************************************declare -i sum=0declare -i i=1until [ $i -gt 100 ];do sum=$[$sum+$i] let i++doneecho "1-100 sum is: $sum"
循环控制命令:(1)break [N] 提前退出N层循环;N省略时表示退出break语句所在的循环
(2)continue [N] 提前退出第N层的本轮循环,而直接进入下一轮
实例:使用break,取10个随机数并排序
#!/bin/bash#*****************************************************************************************# Check user login System *# zouhg 2014-12-3 *#*****************************************************************************************#*****************************************************************************************# Mian function code *#*****************************************************************************************main(){ declare -a rand declare -i swap=0 declare -i j=0 for i in {0..9};do j=$i rand[$i]=$RANDOM while [ $j -gt 0 ];do if [ ${rand[$j]} -lt ${rand[$[$j-1]]} ];then swap=${rand[$j]} rand[$j]=${rand[$[$j-1]]} rand[$[$j-1]]=$swap let j-- else break fi done let i++ done echo ${rand[@]}} main
死循环格式:
while true;do
循环体
done
while死循环结构解析:在while死循环中,循环体会一直执行,除非用break结束循环,或用exit退出脚本
实例:使用while死循环随机取(1-37)中的两个数,并这两个数不能重复
#!/bin/bash#*****************************************************************************************# Check user login System *# zouhg 2014-12-3 *#*****************************************************************************************#*****************************************************************************************# Mian function code *#*****************************************************************************************declare -i student1=0declare -i student2=0while true ;do if [ $student1 -eq $student2 -o $student1 -eq 0 -o $student2 -eq 0 ];then student1=$[$RANDOM%37] student2=$[$RANDOM%37] else echo "The first student ID:$student1" echo "The second student ID:$student2" break fidone
until true;do
循环体
done
until死循环结构解析:在until死循环中,循环体会一直执行,除非用break结束循环,或用exit退出脚本
实例:使用while死循环随机取(1-37)中的两个数,并这两个数不能重复
#!/bin/bash#*****************************************************************************************# Check user login System *# zouhg 2014-12-3 *#*****************************************************************************************#*****************************************************************************************# Mian function code *#*****************************************************************************************declare -i student1=0declare -i student2=0until false ;do if [ $student1 -eq $student2 -o $student1 -eq 0 -o $student2 -eq 0 ];then student1=$[$RANDOM%37] student2=$[$RANDOM%37] else echo "The first student ID:$student1" echo "The second student ID:$student2" exit 0 fidone
bash脚本编程的其他内容在:linux笔记之bash编程(二)