bash脚本学习

date -d 命令可以把类似这样的日期时间转换成时间戳”Jan 28 16:47:16 2025″,它会计算自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数。

命令如下:

date -d "Jan 28 16:47:16 2025" +%s

请严格按照这种格式进行填写,双引号后面有一个空格不能省略。

如果想要把这个日期变成可替换的,可以把整个命令使用小括号括起来,前面加上$符号,例如:

NOT_AFTER="Jan 28 16:47:16 2025"
timestamp=$(date -d "$NOT_AFTER" +%s)
echo $timestamp

以上代码有几点需要注意:

  • bash脚本不兴有多余的空格,变量声明(变量的创建)时,等号两边不允许有空格。
  • 获取变量要在变量名的前面加$符号。
  • 如果整个命令执行的值要赋值给另一个变量(不管是新的变量还是旧的变量),可以把整个命令使用小括号括起来,然后前面加一个$符号就行。

 

字符串转数字,使用$(( ))把内容括起来,里面的内容会被自动识别为数值计算逻辑运算,注意是双括号,且都是小括号。例如:

NOT_AFTER="Jan 28 16:47:16 2025"
timestamp=$(date -d "$NOT_AFTER" +%s)
days_remaining=$(($timestamp/60/60/24))
echo $days_remaining

 

逻辑表达式

bash脚本的逻辑表达式中,字符串比较通常使用==!= ,数值比较通常使用 -eq (等于)和 -ne(不等于),这是因为 Bash 从 Unix shell 继承了这些比较运算符,而 Unix shell 中并没有为整数比较提供 ==!= 运算符。

以下是 Bash 中字符串和整数比较的区别:

  • 字符串比较:

    if [ "$string1" == "$string2" ]; then
        echo "字符串相等"
    fi
    
    if [ "$string1" != "$string2" ]; then
        echo "字符串不相等"
    fi
  • 整数比较:

    if [ "$int1" -eq "$int2" ]; then
        echo "整数相等"
    fi
    
    if [ "$int1" -ne "$int2" ]; then
        echo "整数不相等"
    fi

如果你尝试使用 == 来比较整数,Bash 会将其视为字符串比较,这可能会导致意外的结果,特别是当整数变量包含前导零或不同的位数时。例如:

int1=08
int2=8

if [ "$int1" == "$int2" ]; then
    echo "相等"  # 这会输出“相等”,因为 Bash 将它们视为字符串比较,而 "08" 和 "8" 作为字符串是不相等的。
fi

if [ "$int1" -eq "$int2" ]; then
    echo "相等"  # 这不会输出任何内容,因为作为整数,08 和 8 是不相等的。
fi

因此,为了正确地比较整数,你应该使用 -eq-ne 运算符。

逻辑表达式中整数比较不加引号也行

在 Bash 脚本中,是否在条件测试 [ ... ] 中对变量使用引号取决于具体情况。对于整数比较,通常可以不加引号,因为整数变量不包含空格或其他特殊字符,这些字符可能会导致条件测试被错误解析。然而,使用引号是一种更保守的做法,可以防止一些潜在的问题,特别是在变量值未知或可能为空的情况下。

以下是两种情况的比较:

使用引号:

if [ "$int1" -eq "$int2" ]; then
    echo "整数相等"
fi

不使用引号:

if [ $int1 -eq $int2 ]; then
    echo "整数相等"
fi

在第二种情况中,如果你的变量 $int1$int2 为空,或者包含空格、特殊字符等,那么条件测试可能会出错。例如:

int1=""
int2=5

if [ $int1 -eq $int2 ]; then
    echo "整数相等"  # 这将导致条件测试语法错误,因为 -eq 两边不能有空的参数。
fi

为了避免这类问题,推荐在条件测试中总是使用引号,除非变量的内容是已知的,并且不包含任何可能导致解析错误的字符。使用引号是一种好的编程习惯,可以提高脚本的健壮性和可移植性。

 

if语句基础

基本if语句命令判断如果特定条件为true,则仅执行给定的一组操作。如果条件为false,则不要执行这些操作。if语句基本语法格式如下:

if [ expression ];  
then  
statements  
fi

仅当表达式(在方括号之间)为真时,才会执行thenfi之间的语句。

注意:观察第一行中使用的空格,在第一行末尾使用分号。两者都必须使用,if条件语句以fi结尾。

 

  • 使用AND运算符使用多个条件:
    if [ expression_1 ] && [ expression_2 ];  
    then  
    statements  
    fi
    
    Bash
  • 使用OR运算符使用多个条件:
    if [ expression_1 ] || [ expression_2 ];  
    then  
    statements  
    fi
    
    Bash
  • 对于具有AND&OR运算符的复合表达式,可以使用以下语法:
    if [ expression_1 && expression_2 || expression_3 ];  
    then  
    statements  
    fi

//更多请阅读:https://www.yiibai.com/bash/bash-if-statement.html

示例1

在此示例中,读取用户输入任意数字,并检查该值是否大于100

脚本文件:if-example1.sh

#!/bin/bash  

read -p " Enter number : " number  

if [ $number -gt 100 ]  
then  
echo "Value is greater than 100"  
fi
执行上面示例代码,得到以下结果:

示例2

在此示例中,通过比较两个字符串的值,简单演示了if语句的用法。
脚本文件:if-example2.sh

#!/bin/bash  

# if condition is true  
if [ "yiibai" == "yiibai" ];  
then  
echo "true condition"  
fi  

# if condition is false  
if [ "yiibai.com" == "xntutor.com" ];  
then  
echo "false condition"  
fi
Bash

执行上面示例代码,得到以下结果:

 

示例3

在此示例中,演示如何使用if语句比较数字。
脚本文件:if-example3.sh

#!/bin/bash  

#if condition (greater than) is true  
if [ 10 -gt 3 ];  
then  
echo "10 is greater than 3."  
fi  

#if condition (greater than) is false  
if [ 3 -gt 10 ];  
then  
echo "3 is not greater than 10."  
fi  

#if condition (lesser than) is true  
if [ 3 -lt 10 ];  
then  
echo "3 is less than 10."  
fi  

#if condition (lesser than) is false  
if [ 10 -lt 3 ];  
then  
echo "10 is not less than 3."  
fi  

#if condition (equal to) is true  
if [ 10 -eq 10 ];  
then  
echo "10 is equal to 10."  
fi  

#if condition (equal to) is false  
if [ 10 -eq 9 ];  
then  
echo "10 is not equal to 9"  
fi
Bash

执行上面示例代码,得到以下结果:
示例3

 

示例4

在此示例中,将演示如何在if表达式中使用AND运算符包括多个条件。

脚本文件:if-example4.sh

#!/bin/bash  

# TRUE && TRUE  
if [ 8 -gt 6 ] && [ 10 -eq 10 ];  
then  
echo "Conditions are true"  
fi  

# TRUE && FALSE  
if [ "mylife" == "mylife" ] && [ 3 -gt 10 ];  
then  
echo "Conditions are false"  
fi
Bash

执行上面示例代码,得到以下结果:

maxsu@ubuntu:~/bashcode$ vi if-example4.sh
maxsu@ubuntu:~/bashcode$ chmod +x if-example4.sh
maxsu@ubuntu:~/bashcode$ ./if-example4.sh 
Conditions are true
maxsu@ubuntu:~/bashcode$

 

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注