Bash 条件表达式的6 个示例 (-e, -eq, -z,..)

举报
Tiamo_T 发表于 2022/02/24 16:04:29 2022/02/24
【摘要】 Bash 表达式是用于形成 bash 条件语句的运算符、特征或值的组合。条件表达式可以是二进制或一元表达式,涉及数字、字符串或任何成功时返回状态为零的命令。

Bash 表达式是用于形成 bash 条件语句的运算符、特征或值的组合。条件表达式可以是二进制或一元表达式,涉及数字、字符串或任何成功时返回状态为零的命令。


有几个条件表达式可用于测试文件。以下是一些有用的条件表达式。

  • [ -e filepath ] 如果文件存在,则返回 true。
  • [ -x filepath ] 如果文件存在且可执行,则返回 true。
  • [ -S filepath ] 如果文件存在并且它是一个套接字文件,则返回 true。
  • [ expr1 -a expr2 ] 如果两个表达式都为真,则返回真。
  • [ expr1 -o expr2 ] 如果表达式 1 或 2 中的任何一个为真,则返回真。


Bash 示例 1. 检查文件是否存在

以下 Bash shell 脚本代码片段获取文件名及其绝对路径,并检查文件是否存在并抛出适当的信息。

$ cat exist.sh
#! /bin/bash
file=$1
if [ -e $file ]
then
	echo -e "File $file exists"
else
	echo -e "File $file doesnt exists"
fi

$ ./exist.sh /usr/bin/boot.ini
File /usr/bin/boot.ini exists

请参阅之前的文章以了解各种bash if 语句类型

Bash 示例 2. 比较数字

下面的脚本从用户那里读取两个整数,并检查这两个数字是否相等或大于或小于彼此。

$ cat numbers.sh
#!/bin/bash
echo "Please enter first number"
read first
echo "Please enter second number"
read second

if [ $first -eq 0 ] && [ $second -eq 0 ]
then
	echo "Num1 and Num2 are zero"
elif [ $first -eq $second ]
then
	echo "Both Values are equal"
elif [ $first -gt $second ]
then
	echo "$first is greater than $second"
else
	echo "$first is lesser than $second"
fi

$ ./numbers.sh
Please enter first number
1
Please enter second number
1
Both Values are equal

$ ./numbers.sh
Please enter first number
3
Please enter second number
12
3 is lesser than 12


Bash 示例 3. 基本算术计算器

此示例读取输入,这是一种要对 bash 变量(inp1 和 inp2)执行的算术运算。算术运算可以是加法、减法或乘法。

$ cat calculator.sh
#!/bin/bash
inp1=12
inp2=11
echo "1. Addition"
echo "2. Subtraction"
echo "3. Multiplication"
echo -n "Please choose a word [1,2 or 3]? "
read oper

if [ $oper -eq 1 ]
then
	echo "Addition Result " $(($inp1 + $inp2))
else
	if [ $oper -eq 2 ]
	then
		echo "Subtraction Result " $(($inp1 - $inp2))
	else
		if [ $oper -eq 3 ]
		then
			echo "Multiplication Result " $(($inp1 * $inp2))
		else
			echo "Invalid input"
		fi
	fi
fi

$ ./calculator.sh
1. Addition
2. Subtraction
3. Multiplication
Please choose a word [1,2 or 3]? 4
Invalid input

Bash 示例 4. 读取和 Ping IP 地址

以下脚本用于读取 IP 地址并检查 IP 地址是否可达,并打印相应的消息。

$ cat ipaddr.sh
#!/bin/bash
echo "Enter the Ipaddress"
read ip

if [ ! -z $ip ]
then
	ping -c 1 $ip
	if [ $? -eq 0 ] ; then
		echo "Machine is giving ping response"
	else
		echo "Machine is not pinging"
	fi
else
	echo "IP Address is empty"
fi

$ ./ipaddr.sh
Enter the Ipaddress
10.176.191.106

Pinging 10.176.191.106 with 32 bytes of data:

Reply from 10.176.191.106: bytes=32 time<1ms TTL=128

Ping statistics for 10.176.191.106:
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
Machine is giving ping response

在此示例中,如果 ipaddress 的长度为零,则 -z 返回 true,如果条件前面有 ! (negate) 运算符,如果表达式为假,则进入 if 部分执行。所以当IP地址不为空时,它进入并检查该IP地址是否可达。

Bash 示例 5. 安装程序脚本

大多数软件包的安装程序脚本不允许以 root 用户身份执行。脚本检查正在执行的用户并抛出错误。

以下脚本仅在执行的用户不是 root 时才允许您执行 oracle 安装程序脚本。

$ cat preinstaller.sh
#!/bin/bash
if [ `whoami` != 'root' ]; then
	echo "Executing the installer script"
	./home/oracle/databases/runInstaller.sh
else
	echo "Root is not allowed to execute the installer script"
fi

Executing the script as a root user,
# ./preinstaller.sh
Root is not allowed to execute the installer script

在此示例中,命令 whoami 的输出与单词“root”进行比较。对于字符串比较 ==, !=, < 应该使用 and 对于数值比较 eq, ne,lt 和 gt 应该使用。

Bash 示例 6. 增强的括号

在上述所有示例中,我们仅使用单括号来包围条件表达式,但 bash 允许使用双括号,作为单括号语法的增强版本。

$ cat enhanced.sh
#!/bin/bash
echo "Enter the string"
read str
if [[ $str == *condition* ]]
then
	echo "String "$str has the word \"condition\"
fi

$ ./enhanced.sh
Enter the string
conditionalstatement
String conditionalstatement has the word "condition"
  • [ 是测试命令的同义词。即使它内置在 shell 中,它也会创建一个新进程。
  • [[ 是它的新改进版,是关键字,不是程序。
  • [[ Korn 和 Bash 理解。
  • 在上面的示例中,如果变量 $str 在任何地方都包含短语“条件”,则条件为真。
  • 这是shell globbing 功能,仅当您使用[[(双括号)时才支持该功能,因此不需要引用许多参数。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。