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:" username
while ! who |grep "^$username";do
        sleep 5
done
echo "$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$1
done


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.$i
done


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
        done
done





while循环的详细讲解:

while  条件表达式  ;do


    循环体

    循环控制变量的修正表达式


done

while循环结构解析:当条件表达式为真时,执行循环体和循环控制变量的修正表达式;当条件表达式为假时退出循环

实例:统计1-100正整数之和

#!/bin/bash
#*****************************************************************************************
#                              Check user login System                                   *
#                              zouhg 2014-12-3                                           *
#*****************************************************************************************
#*****************************************************************************************
#                               Mian function code                                       *
#*****************************************************************************************
declare -i sum=0
declare -i i=1
while [ $i -le 100 ];do
        sum=$[$sum+$i]
        let i++
done
echo "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=0
declare -i i=1
until [ $i -gt 100 ];do
        sum=$[$sum+$i]
        let i++
done
echo "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=0
declare -i student2=0
while 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
	fi
done


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=0
declare -i student2=0
until 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
	fi
done





bash脚本编程的其他内容在:linux笔记之bash编程(二)