bash脚本编程之if分支结构和位置变量的应用以及交互示例

bash脚本编程的结构:

bash脚本编程语言是脚本类语言、解释型语言、过程式编程语言。

过程式编程语言的结构:

顺序执行结构(默认):

从上到下,自左而右的执行所有的语句(命令)

选择执行结构:

当条件满足或不满足时,才会执行对于的语句(命令)

循环执行结构:

重复执行某段语句(命令)

在bash脚本编程语言中也具备上述结构:

顺序执行结构:bash默认的执行结构

选择执行结构:

根据给定的条件的逻辑判断结果或根据某个可选取的取值范围进而选择某个分支结构中的语句(命令)予以执行;

if:分支选择执行结构的标准,根据条件的逻辑判断结果来选择执行的语句内容;

case:选择执行结构的标准,根据符合某特定范围的取值标准来选择执行的语句内容;

循环执行结构:对于结构内的特定语句内容,重复执行0次,1次或多次;

for循环:遍历列表的方式来进行循环;

while循环:根据给定的逻辑判断结果来进行循环;逻辑判断结果为真才循环,否则停止循环;

until循环:根据给定的逻辑判断结果来进行循环;逻辑判断结果为假才循环,否则停止循环;

select循环:死循环,即没有默认退出条件的循环;利用循环提供一个可选择的列表;

bash脚本的执行结构之if选择执行结构:

if语句:格式:

if: if 命令; then 命令; [ elif 命令; then 命令; ]... [ else 命令; ] fi   ---用fi作结尾,与if遥相呼应

if执行结构包括单分支、双分支以及多分支执行结构:

if语句的单分支结构:

if 命令; then 命令; fi

注意:是否会执行then后面的命令,取决于if后面的命令的执行状态返回值;

            1.如果返回值为真,则执行后面的命令;

            2.如果返回值为假,则不执行后面的命令;

书写形式两种:

if CONDITION ; then

STATEMENT

...

fi

if CONDITION

then

STATEMENT

...

fi

if语句的双分支结构:

if 命令; then 命令;  elif 命令; fi

注意:是否会执行then或else后面的命令,取决于if后面的命令的执行状态返回值;

            1.如果返回值为真,则执行then后面的命令;

            2.如果返回值为假,则执行else后面的命令;

书写形式两种:

if CONDITION ; then

STATEMENT

...

else

STATEMENT

...

fi

if CONDITION

then

STATEMENT

...

else

STATEMENT

...

fi

if语句的多分支结构:

if 命令; then 命令; [ elif 命令; then 命令; ]... [ else 命令; ] fi

注意:是否会执行then或else后面的命令,取决于if后面的命令的执行状态返回值或else后面的命令的状态返回值;

            1.首先判断if后面的命令的状态返回值是否是真,如果为真,就执行then后的语句;如果为假,就继续判断第一个elif后面的命令的执行状态返回值;

            2.第一个elif后面的命令的执行状态返回值为真,就执行elif语句中then后面的命令,否则,就继续判断第二个elif后面的命令的执行状态返回值;

            3.以此类推,会判断每个elif后面的命令的执行状态返回值是否是真;如果使用的if和elif后面的命令的执行状态返回值均为假,则执行else后面的语句;

书写格式两种:

if CONDITION1 ; then

STATEMENT

...

elif CONDITION2 ; then

STATEMENT

...

elif CONDITION3 ; then

STATEMENT

...

...

else

STATEMENT

...

fi

if CONDITION

then

STATEMENT

...

elif CONDITION2 ; then

STATEMENT

...

elif CONDITION3 ; then

STATEMENT

...

...

else

STATEMENT

...

fi

if的多分支结构,用到的不多,有时候可以使用嵌套的单分支或双分支if结构代替if多分支结构;

嵌套的if结构:

if CONDITION1 ; then

if CONDITION2 ; then

if CONDITION3 ; then

STATEMENT

...

else

STATEMENGT

...

fi

else

STATEMENT

...

fi

else

STATEMENT

...

fi

例:写一个脚本,判断某个用户的的默认登录shell是否为/bin/bash,如果不是,显示其登录shell;

#!/bin/bash

#

USERNAME=$(cut -d: -f1 /etc/shadow | sort -R | head -1)

USERSHELL=$(egrep  "^$USERNAME\>"" /etc/passwd | cut -d: -f7)

if [ $"USERSHELL" == "/bin/bash" ] ; then

echo "${USERNAME}'s login is /bin/bash"

else

echo "${USERNAME}'s login is ${USERSHELL}"

fi

//最后要撤销已经定义过的变量,否则会造成内存空间的浪费

unset USERNAME USERSHELL

bash脚本编程之用户交互使用:

位置参数变量:

$0:命令的本身,对于脚本而言,就是该脚本的路径;

$1,$2,...$N:脚本后面通过命令行给脚本传递命令行参数;

【N>9时,引用该位置变量时需要加花括号{},即${10}】

特殊变量:

[email protected]:给出的所有位置参数的列表,当使用双引号引用时,每个参数作为单独的字符串存在;

$*:给出的所有位置参数的列表,当使用双引号引用时,整个参数列表被当做一个字符串;

$#:表示除了$0之外传递参数的个数;

{shift:shift: shift [n]

移位位置参数。

重命名位置参数 $N+1、$N+2 ... 到 $1、$2 ...  如果没有给定 N,

则假设为1.

退出状态:

返回成功,除非 N 为负或者大于 $#。

具体含义:在脚本中添加shift命令后,$0指文件的路径基名,无法被替换,shift无法对$0进行移位,只能相应的对后面的$1进行移位操作,shift命令操作之后(默认是移动1位),原来的$0保持不变,原来的$1被移位即消除没有了,原来的$2变成了进行shift命令操作后的$1,原来的$3变成了进行shift命令操作后的$2,后续位置元素同样道理;当(shift 2)命令操作即移位2位,原来的$3变成了移位操作后的$1}

read命令:

read  [-a 数组]  [-p 提示符] [-t 超时] [-u 文件描述符] [名称 ...]

-a array:定义索引数组;

-p prompt:给用户输出提示信息;

-t timeout:用户输入的超时时间;

name:变量或数组的名称;如果省略此内容,bash会将read读到的信息保存到一个内置的名为REPLY变量中

注意:Linux哲学思想之一:尽量不与用户交互;在使用read时,通常使用-t选项来指定与用户交互的时间,一旦交互时间超过预定时间,脚本中后续的命令内容会自动被执行;因此,通常需要在后面判断通过read赋值的变量值是否为空,如果为空,可能需要为该变量提供默认值;

read -t 5 VAR1

[ -z $VAR1 ] && VAR1=value1  --提供默认值

例:

管理用户的脚本:

脚本可以接受两个参数,第一个参数为-a或者-d,第二个参数为用户名;如果第一个参数是-a,则创建其后面参数命名的用户;如果第一个参数为-d,则删除其后面参数命名的用户;

#!/bin/bash

#

if [ $# -ne 2 ];then

echo "Make sure provide TWO argumengts."

exit 5

fi

if [ $1 == '-a' ];then

if ! id $2 &> /dev/null ;then

useradd $2 &> /dev/null

echo $2 | passwd --stdin $2 &> /dev/null

echo "User $2 has created successfully and it's passwd has changed to it's username."

else

if id $2 &> dev/null ;then

echo "User $2 has existed."

fi

fi

elif [ $1 == '-d' ];then

if id $2 &> /dev/null;then

userdel $2 $> /dev/null

echo "User $2 deleted finihed."

else

echo "User $2 does not exists yet."

fi

else

echo "Usage: $(basename $0) -a USERNAME | -d USERNAME"

exit 6

fi

和用户交互使用read命令:

#!/bin/bash

#

if [ $# -ne 2 ];then

echo "Make sure provide TWO argumengts."

exit 5

fi

if [ $1 == '-a' ];then

read -p "Please input a username for creating: " USERNAME

if ! id $USERNAME &> /dev/null ;then

useradd $USERNAME &> /dev/null

echo $USERNAME | passwd --stdin $USERNAME &> /dev/null

echo "User $USERNAME has created successfully and it's passwd has changed to it's username."

else

if id $USERNAME &> dev/null ;then

echo "User $USERNAME has existed."

fi

fi

elif [ $1 == '-d' ];then

read -p "Please input a username for deleting: " USERNAME

read -p -t5 "Are you sure to delete $USERNAME? Input 'yes/no' to be next." CHOICE

[ -z $CHOICE ] && CHOICE='no'

if [ $CHOICE == 'yes' ];then

if id $USERNAME &> /dev/null;then

userdel $USERNAME $> /dev/null

echo "User $USERNAME deleted finihed."

else

echo "User $USERNAME does not exists yet."

fi

else [ $CHOICE == 'no' ];then

echo "$USERNAME is not deleted."

fi

else

echo "Usage: $(basename $0) {-a | -d}"

exit 6

fi

时间: 2024-08-07 15:03:53

bash脚本编程之if分支结构和位置变量的应用以及交互示例的相关文章

bash脚本编程之case语句及脚本选项进阶

case语句及脚本选项进阶详解     面向过程程序设计语言中的控制流(即程序当中的语句)默认是顺序执行的. 程序设计语言的控制结构一共有三类: 1,顺序结构 2,选择结构 (1)if语句 ->单分支的if语句 格式:if condition1;then expression ... fi ->双分支的if语句 格式:if condition1;then expression ... else expression ... fi ->多分支的if语句 格式:if condition1;t

菜鸟的Linux之路3 bash脚本编程之二

整数测试及特殊变量     在开始之前我们先介绍一个可以提前结束脚本的命令->exit exit的作用是退出当前进程.退出当前脚本,任何一个命令或者说是任何一个进程执行结束的时候都会有一个执行结果返回值和一个执行状态结果返回值,exit是用来让用户自定义执行状态结果返回值的命令. 命令.脚本或者说是进程的执行状态结果有两种情况: ->正确执行 ->错误执行 而这种状态可以使用exit命令自定义. exit命令使用格式:exit #(0-255) 0值,表示执行正确 1-255的值,均表示

bash脚本编程之(3/4)条件判断、算符运算、整数测试、文件测试、特殊变量等笔记

Shell编程: 编译器,解释器 编程语言: 机器语言.汇编语言.高级语言 静态语言: 编译型语言 强类型(变量) 事先转换成可执行格式 c\c++\JAVA\c# 动态语言: 解释性语言 弱类型 边解释边执行 asp/asp.net/php/shell/python/perl Shell: 弱类型编程语言 强类型: 变量在使用前,必须事先声明,甚至还需要初始: 弱类型: 变量用时声明,甚至不区分类型: 面向过程: Shell C 面向对象: JAVA Python, perl, c++ 变量:

bash脚本编程之for循环及应用

循环执行结构: 循环结构包括两个环节: 1.进入循环的条件: 在符合要求或满足条件时才开始循环: 2.退出循环的条件: 达到某个要求或符合某个条件时需要结束或终止循环的执行: for循环: 1.遍历列表的循环: 为列表中的每个成员执行命令. for 名称 [in 词语 ... ] ; do 命令; done 建议在脚本中的书写格式: for VAR_NAME in LIST ; do 循环体 done 或 for VAR_NAME in LIST do 循环体 done 注意: VAR_NAME

bash脚本编程之在bash脚本中使用选项

[[email protected] ~]# vim a #!/bin/bash # Name:abc # Description:Create script # Author:mylinux # Version:0.0.1 # Datatime:03/02/12 14:42:00 # Usage:mkscript FILENAME cat >$1  <<EOF #!/bin/bash # Name: `basename $1` # Description: # Author: myli

bash脚本编程之(1/4) 变量、变量类型等笔记

Shell编程: 编译器,解释器 编程语言: 机器语言.汇编语言.高级语言 静态语言: 编译型语言 强类型(变量) 事先转换成可执行格式 c\c++\JAVA\c# 动态语言: 解释性语言 弱类型 边解释边执行 asp/asp.net/php/shell/python/perl Shell: 弱类型编程语言 强类型: 变量在使用前,必须事先声明,甚至还需要初始: 弱类型: 变量用时声明,甚至不区分类型: 面向过程: Shell C 面向对象: JAVA Python, perl, c++ 变量:

bash脚本编程之case语句

case语句用于简化复杂的if语句 #!/bin/bash while true; do   read -p "Enter your score:" score   if [ "$score" == "quit" ]; then           exit 0   elif [ $score -lt 60 ]; then           echo "stupid"           break   elif [[ $s

bash脚本编基础

使用多个命令(;): 如果需要两个或多个命令一起执行,用分号把这些命令隔开: #date ; ifconfig eth0 Sat Nov  1 08:47:46 CST 2014 eth0      Link encap:Ethernet  HWaddr 00:50:56:9F:22:36 inet addr:192.168.57.23  Bcast:192.168.57.255  Mask:255.255.255.0 inet6 addr: fe80::250:56ff:fe9f:2236/6

shell编程之case分支语句

shell编程之case分支语句 case分支语句和if的多分支语句很相似. if多分支语句一般用在有(区间范围)的地方 :例如:0-100之间. if需要判断多个不同的条件. case的分支语句用在 如果里面匹配到固定值:或某个变量存在多中取值,需要对其中的每一个取值分别执行不同的命令序列. case只是判断一个变量的不同取值. case的模式: 执行流程: 首先使用"变量值"与模式1进行比较,如果取值相同就执行模式1的命令序列1,直到遇见" ;; "后跳转到es