bash脚本编程之条件判断、条件测试

脚本编程:

编程面向过程有如下几种执行方式

顺序执行

选择执行:  如 if, case

循环执行:  如 for, while, until

bash的变量类型:

本地变量

set VAR_NAME=value 设置变量赋值 如: set User=Centos

unset VAR_NAME 撤消变量赋值 如: unset User=Centos

${VAR_NAME}

作用范围:当前shell进程;

局部变量

local VAR_NAME=value 设置变量赋值

unset VAR_NAME 撤消变量赋值

${VAR_NAME}

作用范围:在当前shell进程的局部范围内有效;

环境变量

export VAR_NAME=value 设置变量赋值

unset VAR_NAME 撤消变量赋值

${VAR_NAME}

使用范围:当前shell及其子shell;

位置变量:$1, $2, ...

特殊变量:$$, $?, $#, [email protected], ...

bash命令有执行状态返回值;

$? : 用于保存脚本执行的最后一条命令的状态返回值;

0:表示成功执行;

1-255:表示失败,1,2,127为系统默认保留

[email protected], $*: 所有位置参数;

$#: 位置参数的个数;

注:可以使用exit命令在脚本中自定义脚本执行状态返回值;

如果不定义,脚本执行状态返回值取决于脚本执行结束前最后执行的那个语句的状态;

for 循环使用方式:

for 变量 in 列表; do

语句1;

语句2;

...

done

for 循环使用方式:

for 变量 in {1..100}; do

语句1;

语句2;

...

done

for 循环使用方式:

for 变量 in `seq [起始数 [步进长度] 结束数]`; do

语句1;

语句2;

...

done

例: 查看/var/log各文件类型

#!/bin/bash

#

for Lock in /var/log/* ;do

file $Lock

done

例: 写脚本计算1-100之和

#!/bin/bash

#

Sum=0

for A in {1..100};do

Sum=$[$Sum+$A]

done

echo "Sum:$Sum"

例: 写脚本计算1-100所有奇数之和

#!/bin/bash

#

Sum=0

for A in `seq 1 2 100`;do

Sum=$[$Sum+$A]

done

echo "Sum:$Sum"

条件判断 if 语句

单分支if语句使用方式:

if 条件; then

语句1

语句2

...

fi

例: 写一个脚本,实现如下功能:如果存在,就显示其UID和SHELL;

#!/bin/bash

#

UserName=User1

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

grep "^$UserName\>" /etc/passwd | cut -d: -f 3,7

fi

双分支if语句使用方式:

if 条件; then

语句1

语句2

...

else

语句1

语句2

...

fi

例: 写一个脚本:如果指定的用户存在,先说明其已经存在,并显示其ID号和SHELL;

否则,就添加用户,并显示其ID号

#!/bin/bash

#

User=User1

if  id $User > /dev/null ;then

grep "^$User\>" /etc/passwd | cut -d: -f3,7

else

useradd $User

echo `grep "^$User\>" /etc/passwd | cut -d: -f3`

fi

bash条件测试:可独立执行的命令不需使用如下测试的方式;

[ expression ]

          [[ expression ]]

           test expression

expression: 如:数值1  比较符号  数值2

大于:-gt, 例如 $A -gt $B

大于或等于:-ge

等于:-eq

小于:-lt

小于或等于:-le

不等于:-ne

bash有个内置变量:$RANDOM 其值为随机变化

整数测试:

例:写一个脚本,生成两个随机数,比较其大小;显示大数

#!/bin/bash

#

A=$RANDOM

B=$RANDOM

if [ $A -ge $B ] ;then

echo "Max number is $A"

else

echo "Max number is $B"

fi

例: 求200以内所有为3的整数倍的整数之和;

#!/bin/bash

#

Sum=0

for I in {1..200}; do

if [ $[$I%3] -eq 0 ]; then

Sum=$[$Sum+$I]

fi

done

echo "Sum: $Sum."

 shift [n]:实现位置参数轮替

例:通过参数传递n个正整数给脚本,求其和;

#!/bin/bash

#

Sum=0

for I in `seq 1 $#`; do

Sum=$[$Sum+$I]

shift

done

echo $Sum

bash编程: 位置变量

如: $1, $2, $3, $4, ...

例:计算N以内所有奇数的和以及所有偶数的和;分别显示之;N是通过参数传递过来的正整数;

#!/bin/bash

#

EvenSum=0

OddSum=0

for I in `seq 1 $1`;do

if [ $[$I%2] -eq 1 ]; then

OddSum=$[$OddSum+$I]

else

EvenSum=$[$EvenSum+$I]

fi

done

echo "EvenSum: $EvenSum."

echo "OddSUm: $OddSum."

echo "Sum: $[$EvenSum+$OddSum]"

字符测试:

>: 大于

<: 小于

==: 等于

!=:测试是否不等,不等为真,等为假

=~: 判断左边的字符串是否能够被右边的模式所匹配;通常用于[[]]

如: [[ $opt1 =~ $opt2 ]]

一般做行首、行尾锚定;不要加引号;

例: 写一个脚本通过参数传递一个字符串给脚本,如果传递的字符串“memory”或“Memory”

就以MB为单位显示当前主机的内存信息;否则,就显示/proc/uptime文件的内容。

#!/bin/bash

#

if [[ $1 =~ [Mm]emory$ ]]; then

free -m

else

cat /proc/uptime

fi

例: 写一个脚本:判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor_id一行              中。如果其生产商为GenuineIntel,就显示其为Intel公司;否则,就显示其为AMD公司;

#!/bin/bash

#

Vendor=`grep "vendor_id" /proc/cpuinfo | uniq | cut -d: -f2`

if [[ "$Vendor" =~ [[:space:]]*GenuineIntel$ ]]; then

echo "Intel"

else

echo "AMD"

fi

单目测试:

-z $STRING: 为空则为真,不空则为假;

-n $STRING: 为空则为假,不空则真;

例: 写一个脚本,判定用户的shell是否为bash;

#!/bin/bash

#

Shell=`grep "^$1:" /etc/passwd | cut -d: -f7`

if [ -z $Shell ]; then

echo "No such user or User‘s shell is null."

exit 3

fi

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

echo "Bash User."

Ret=0

else

echo "Not Bash User."

Ret=4

fi

exit $Ret

组合条件测试

-a: 与

-o: 或

!: 非,单目操作符

bash命令组合测试:

&&: 与

||: 或

!: 非

例:写一脚本,给定用户,如果其不存在,就退出脚本。

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

echo "No such user."

exit 3

fi

例:写一个脚本通过参数传递一个字符串给脚本,如果传递的字符串“memory”或“Memory”

就以MB为单位显示当前主机的内存信息;否则,就显示/proc/uptime文件的内容。

#!/bin/bash

#

if [ $1 == "memory" -o $1 == "Memory" ];then

free -m

else

cat /proc/uptime

fi

bash条件判断之多分支if语句:

语法格式:

if 条件1; then

语句1

语句2

...

elif 条件2; then

语句1

语句2

...

elif 条件3; then

语句1

语句2

...

else

语句1

语句2

...

fi

例:判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor id一行中。

如果其生产商为GenuineIntel,就显示其为Intel公司;

如果其生产商为AuthenticAMD,就显示其为AMD公司;否则,就显示无法识别;

#!/bin/bash

#

Vendor=`grep "vendor_id" /proc/cpuinfo | uniq | cut -d: -f2`

if [[ $Vendor =~ [[:space:]]*GenuineIntel$ ]]; then

echo "intel"

elif [[ $Vendor =~ [[:space:]]*AuthenticAMD$ ]]; then

echo "AMD"

else

echo "Unknown"

fi

例:通过参数传递给脚本一个字符串,如Fedora, Gentoo, Redhat

判断Linux发行版所处理主流发行系列:

如果为fedora, centos, redhat,就显示RedHat;

如果为suse, opensuse,就显示为SUSE;

如果为ubuntu, mint, debian,就显示为Debian;否则,显示为其它或无法识别;

#!/bin/bash

#

if [ $1 == fedora -o $1 == centos -o $1 == redhat ];then

echo "$1 is Redhat"

elif [ $1 == suse -o $1 == opensuse ];then

echo "$1 is Suse"

elif [ $1 == ubuntu -o $1 == mint -o $1 == debian ];then

echo "$1 is Debian"

else

echo "Unknown"

fi

文件测试:

操作符文件路径:

-f : 测试其是否为普通文件,即ls -l时文件类型为-的文件;

-d : 测试其是否为目录文件,即ls -l时文件类型为d的文件;

-e : 测试文件是否存在;存在为真,否则为假;

-r : 测试文件对当前用户来说是否可读;

-w: 测试文件对当前用户来说是否可写;

-x: 测试文件对当前用户来说是否可执行;

-s: 测试文件大小是否不空,不空则真,空则假;

例: 如果/tmp/test10不存在,就创建之;

if [ ! -e /tmp/test10 ];then

mkdir /tmp/test10

fi

短路操作:只要前半段已经可以决定最终结果,后半段就不再运算;

与运算:

真 && 真 = 真

真 && 假 = 假

假 && {真|假} = 假

或运算:

假 || 0 = 0

假 || 1 = 1

真 || =1

例:使用短路操作运算,测试/tmp/test10文件是否存在,若存在则退出,不存在则创建

[ -e /tmp/test10 ] || mkdir /tmp/test10

文中如有错误之处,欢迎大家指教,谢谢!

bash脚本编程之条件判断、条件测试,布布扣,bubuko.com

时间: 2024-10-11 22:37:36

bash脚本编程之条件判断、条件测试的相关文章

Linux学习笔记--bash脚本编程之二、条件判断

 bash脚本编程之二.条件判断 条件判断: 如果用户不存在 添加用户,给密码并显示添加成功: 否则 显示用户已存在,没有添加 bash中如何实现条件判断? 整数测试 字符测试 文件测试 条件测试的表达式:     [expression]     [[expression]]     test expression 整数比较: -eq:测试两个整数是否相等:比如 $A -eq $B     -ne:测试两个整数是否不等:不等,为真:相等,为假:     -qt:测试一个数是否大于另一个数:大于

bash脚本编程基础

bash编程   bash脚本编程是过程式解释编程,其实就是linux命令的堆砌,既然是编程就应该有相应编程语法.    与任何过程式编程一样,过程式编程的特点就是:顺序执行,选择执行,循环执行.    过程式编程:以指令为中心,设计算法,数据服务于算法,过程式编程的灵魂:算法.    1.变量:数值变量,字符变量           bash环境:                本地变量:当前shell进程:                环境变量:当前shell进程及其子进程:       

bash脚本编程之变量、变量类型、条件测试、算术运算、及特殊变量

一.学习目的 1.了解bash脚本的变量类型及变量的使用 2.了解bash中条件测试的种类及如何在bash中实现条件的判断 3.学会在bash中做算术运算 4.了解特殊变量的使用 二.学习内容 1). ①.bash的变量类型: 环境变量 .本地变量.局部变量.位置变量.特殊变量 环境变量: export VALUENAME = VALUE 作用领域是当前的shell进程及其子进程 本地变量: VALUENAME= VALUE 作用领域为整个bash的进程 局部变量:local VALUENAME

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

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

bash脚本编程之条件判断

1.bash脚本编程格式: 顶格写#!/bin/bash 接下来给出一些注释信息,以#开头如: #description #version #auhor ceshi <[email protected]> #date 2017-11-07 然后代码注释 缩进,适度添加空白行 2.变量介绍: 局部变量 本地变量 环境变量 位置参数变量 特殊变量 3.数据类型: 字符型 数值型 4.bash算数运算: 方法①:let var=$num1 op $num2 方法②:var=$[ expression

bash 脚本编程之二 条件判断

bash中如何实现条件判断 条件判断类型: 整数判断(双目判断): -eq:等于 .equal,测试两个整数之间是否相等,比如$A -eq $B -gt:大于.greater than -lt:小于.lesser than -ne:不等于.no  equal 这里也可以用另外一种写法,比如[ 2 -ne 3 ]可以写作[ ! 2 -eq 3 ] -le:小于或等于.lesser or equal -ge:大于等于.greater or equal ... 字符判断: 文件判断:单目判断 -e:e

bash脚本编程的语法知识点总结第一部分

bash脚本编程的所有语法知识点总结第一部分 名词概念 bash脚本编程,从字面意思理解也就是shell脚本编程.bash应该是目前Linux上最流行的shell脚本解释程序.shell是一个命令语言解释器,而shell脚本则是Linux命令的集合,按照预设的顺序依次解释执行,来完成特定的.较复杂的系统管理任务,类似于Windows中的批处理文件. 1.shell脚本格式 第一行,顶格. eg: #!/bin/bash #!/usr/bin/python 其它的以#开头的行均为注释,会被解释器忽

bash脚本编程详细剖析

bash脚本编程详细剖析          背景:bash脚本编程是Linux学习一个至关重要的部分,想完成一个脚本可能很简单:但是想让自己的脚本写的让人觉得心旷神怡实为不简单.bash是所有Linux发行版的几乎都有的,因此我们这里以bash脚本为例,讨论bash脚本的编写方法.对于bash脚本编程中一些比较重要的知识点,我这里也会给予案例演示. 一.脚本编程中前话: 我们都知道,bash脚本编程说白了就是命令的堆积.只不过这种堆积的方式不是杂乱无章的堆积,而是按照一定要求和格式的链接.这说明

Linux命令:bash脚本编程

bash脚本编程简介: 此文假定你没有任何关于脚本或一般程序的编程知识, 但是如果你具备相关的知识, 那么你将很容易就能够达到中高级的水平. . . 你可以把此文作为参考, 自学手册, 或者是关于shell脚本技术的文档. 介绍内容包括: A:变量.变量类型 B:条件判断 C:算术运算 D: E: F: G: A.bash变量类型: 1)本地变量:(局部变量) set VARNAME=VALUE: 作用域为整个bash进程: 2)局部变量: local VARNAME=VALUE:作用域为当前代