Shell脚本

本文介绍了Shell脚本中的字符串、数字和文件判断语句,以及如何使用if...then...fi结构进行条件判断。详细讲解了read命令用于从键盘读取用户输入,并给出了不同场景的应用示例。同时提到了date命令的使用,展示如何显示和操作日期与时间。
摘要由CSDN通过智能技术生成

1.脚本开头必须有

  1. #! /bin/bash

2.shell脚本判断语句总结

1、字符串判断

str1 = str2      当两个串有相同内容、长度时为真

str1 != str2      当串str1和str2不等时为真

-n str1        当串的长度大于0时为真(串非空)

-z str1        当串的长度为0时为真(空串)

str1         当串str1为非空时为真

2、数字的判断

int1 -eq int2    两数相等为真

int1 -ne int2    两数不等为真

int1 -gt int2    int1大于int2为真

int1 -ge int2    int1大于等于int2为真

int1 -lt int2    int1小于int2为真

int1 -le int2    int1小于等于int2为真

3 文件的判断

-r file     用户可读为真

-w file     用户可写为真

-x file     用户可执行为真

-f file     文件为正规文件为真

-d file     文件为目录为真

-c file     文件为字符特殊文件为真

-b file     文件为块特殊文件为真

-s file     文件大小非0时为真

-t file     当文件描述符(默认为1)指定的设备为终端时为真

3、复杂逻辑判断

-a         与

-o        或

!        非

 

3.if...then...fi的使用

语句格式:

 
语法一:单if语句
if [ condition ] # condition值为true or false
 then
  commands
fi
语句二:if-then-else语句
if [ condition ]
 then
  commands
else
  command2
fi
示例:
#!/bin/bash
# 登录用户是root 输出管理员,你好
# 登录的是普通用户 输出user.你好
if [ $USER == 'root' ]
 then
  echo "管理员, 你好"
else
  echo "user, 你好"
fi
语句三:if-then-elif语句
if [ condition1 ]
 then
  command1
elif [ condition2 ]
 then
  command2
......
else
  commandx
fi
 

示例:

# 两个数判断大小

if [ $1 -eq $2 ]

 then

  echo "$1>$2"

elif [ $1 -eq $2 ]

 then

  echo "$1=$2"

else

  echo "$1<$2"

fi

 

If...fi应用

  1. 举例:判断字符串是否存在

-z str1 当串的长度为0时为真(空串)

  1. if [ -z "$HOME" ]
  2. then
  3.         echo  "HOME环境变量未配置."
  4.         exit
  5. fi

2.判断目录是否存在

  1. if [ ! -d $hmoe/lib ]
  2. then
  3.         makdir -p $home/lib
  4. fi

 

4.She'll read命令,读取从键盘输入的数据

说明:read 是 Shell 内置命令,用来从标准输入中读取数据并赋值给变量。如果没有进行重定向,默认就是从键盘读取用户输入的数据;如果进行了重定向,那么可以从文件中读取数据

read 命令就是从键盘读取数据。

4.1用法

read [-options] [variables]

options表示选项,如下表所示;variables表示用来存储数据的变量,可以有一个,也可以有多个。

options和variables都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。

4.2Shell read 命令支持的选项

选项         说明


-a array 把读取的数据赋值给数组 array,从下标 0 开始。

-d delimiter 用字符串 delimiter 指定读取结束的位置,而不是一个换行符(读取到的数据不包括 delimiter)。

-e 在获取用户输入的时候,对功能键进行编码转换,不会直接显式功能键对应的字符。

-n num 读取 num 个字符,而不是整行字符。

-p prompt 显示提示信息,提示内容为 prompt。

-r 原样读取(Raw mode),不把反斜杠字符解释为转义字符。

-s 静默模式(Silent mode),不会在屏幕上显示输入的字符。当输入密码和其它确认信息的时候,这是很有必要的。

-t seconds 设置超时时间,单位为秒。如果用户没有在指定时间内输入完成,那么 read 将会返回一个非 0 的退出状态,表示读取失败。

-u fd 使用文件描述符 fd 作为输入源,而不是标准输入,类似于重定向。

4.3应用

【实例1】使用 read 命令给多个变量赋值。

bash01.sh

#!/bin/bash

read -p "Enter some information > " name url age

echo "网站名字:$name"

echo "网址:$url"

echo "年龄:$age"

运行:bash01.sh

运行结果:

Enter some information > C语言 http://...  7

网站名字:C语言

网址:http://...

年龄:7

注意,必须在一行内输入所有的值,不能换行,否则只能给第一个变量赋值,后续变量都会赋值失败。

本例还使用了-p选项,该选项会用一段文本来提示用户输入。

 

【示例2】只读取一个字符。

#!/bin/bash

read -n 5 -p "Enter a char > " char

printf "\n" #换行

echo $char

运行结果:

Enter a char > nihao 

nihao

 

-n 1表示只读取一个字符。运行脚本后,只要用户输入一个字符,立即读取结束,不用等待用户按下回车键。

 

printf "\n"语句用来达到换行的效果,否则 echo 的输出结果会和用户输入的内容位于同一行,不容易区分。

 

【实例3】在指定时间内输入密码。

#!/bin/bash

if

    read -t 20 -sp "Enter password in 20 seconds(once) > " pass1 && printf "\n" && #第一次输入密码

    read -t 20 -sp "Enter password in 20 seconds(again)> " pass2 && printf "\n" && #第二次输入密码

    [ $pass1 == $pass2 ] #判断两次输入的密码是否相等

then

    echo "Valid password"

else

    echo "Invalid password"

fi

这段代码中,我们使用&&组合了多个命令,这些命令会依次执行,并且从整体上作为 if 语句的判断条件,只要其中一个命令执行失败(退出状态为非 0 值),整个判断条件就失败了,后续的命令也就没有必要执行了。

 

如果两次输入密码相同,运行结果为:

Enter password in 20 seconds(once) >

Enter password in 20 seconds(again)>

Valid password

 

如果两次输入密码不同,运行结果为:

Enter password in 20 seconds(once) >

Enter password in 20 seconds(again)>

Invalid password

 

如果第一次输入超时,运行结果为:

Enter password in 20 seconds(once) > Invalid password

 

如果第二次输入超时,运行结果为:

Enter password in 20 seconds(once) >

Enter password in 20 seconds(again)> Invalid password

 

5.脚本中的多行注释

这样两个echo就注释了

#! /bin/bash

<<'COMMENT'

echo "..."

echo "....."

COMMENT

5.She'll  tee 命令

tee命令:

在输出信息的同时把信息记录到⽂件中

例⼦:

ls | tee ls.txt 将会在终端上显⽰ls命令的执⾏结果,并把执⾏结果输出到ls.txt⽂件中,将会覆盖原⽂件的内容,若⽆ls.txt⽂件,将会⾃动创建该⽂件

ls | tee -a ls.txt 保留ls.txt⽂件中原来的内容,并把ls命令的执⾏结果追加到ls.txt⽂件的最后,不覆盖原来的内容

ls | tee file1.txt file2.txt

#!/bin/bash

Writelog="tee -a./logfile.txt"

echo "test tee -a command" | $Writelog

6.Date命令

date命令可以用来显示或设定系统的日期与时间。

星期几 月份 日 时:分:秒 时区 年

 /tmp$ date 

Fri Mar 3 16:56:48 CST 2023

date +"以%开头的控制标志" 

xjh@ubuntu:~/iot/tmp$ date +%H #以“时”的形式显示当前时间

16

xjh@ubuntu:~/iot/tmp$ date +%H:%M #以“时:分”的形式显示当前时间

16:56

xjh@ubuntu:~/iot/tmp$ date +%H:%M:%S #以“时:分:秒”的形式显示当前时间

16:56:57

xjh@ubuntu:~/iot/tmp$ date +%H:%M %S #控制标志之间存在空格时,需要使用双引号包围

date: 额外的操作数 "%S"

Try 'date --help' for more information.

xjh@ubuntu:~/iot/tmp$ date +"%H:%M %S"

17:06 44

xjh@ubuntu:~/iot/tmp$

控制标志 含义 举例(输入"date +控制标志"之后的输出)

日期方面

%a 星期几 (Sun..Sat) Fri

%A 星期几 (Sunday..Saturday) Friday

%b 月份 (Jan..Dec) Mar

%B 月份 (January..December) March

%c 直接显示日期与时间 Fri 03 Mar 2023 05:28:48 PM CST

%d 日(01…31) 03

%D 直接显示日期(月/日/年) 03/03/23

%h 同%b Mar

%j 一年中的第几天 (001..366) 062

%m 月份 (01..12) 03

%U 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形) 09

%w 一周中的第几天 (0..6) 5

%W 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形) 09

%x 直接显示日期,和%D一样? 03/03/2023

%y 年份的最后两位数字 (00…99) 23

%Y 完整年份(0000……9999) 2023

时间方面

%H 小时(00..23) 17

%I(大写i)

小时(01..12) 05

%k 小时(0..23) 17

%M 分钟(00..59) 42

%p 显示本地 AM 或 PM pm

%r 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M) 05:43:29 PM

%s 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数 1677836662

%S 秒(00..61) 39

%T 直接显示时间 (24 小时制) 17:45:05

%X 与%r相同? 05:45:35 PM

%Z 显示时区 CST

其他内容

%n 下一行 

比如date +%T%n%D,会显示时间后跳行,再显示目前日期。

19:52:52

03/03/23

 

可以把无意义的0去掉,比如1999/03/07中03与07前面的0,在控制标记中插入“-”即可。

tmp$ date +%H:%M:%S

08:04:11

tmp$ date +%-H:%-M:%-S

8:4:21

Date显示以前的时间:

tmp$ date -d "-2 day" "+%Y%m%d %A"
20230301 Wednesday
tmp$ date -d "-2 day" +"%Y%m%d %A"
20230301 Wednesday
tmp$ date -d "-1 day" "+%Y%m%d %A" 
20230302 Thursday
tmp$ date -d "-0 day" "+%Y%m%d %A" 
20230303 Friday
tmp$ date -d "1 day" "+%Y%m%d %A" 
20230304 Saturday
tmp$ date -d "2 day" "+%Y%m%d %A"
20230305 Sunday
tmp$ date -d "-1 month" "+%Y%m%d %A"
20230203 Friday
tmp$ date -d "1 month" "+%Y%m%d %A"
20230403 Monday
tmp$ date --date="2 days ago" "+%Y%m%d %A"
20230301 Wednesday

 

 

7.shell中的$应用

名称 含义

$# 传给脚本的参数个数

$0 脚本本身的名字

$1 传递给该shell脚本的第一个参数

$2 传递给该shell脚本的第二个参数

$@ 传给脚本的所有参数的列表

$* 以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个

$$ 脚本运行的当前进程ID号

$? 显示最后命令的退出状态,0表示没有错误,其他表示有错误

8./dev/null

$  rm  1.txt

rm:cannot remove  1. txt  NO  such file  or  directory

$rm  1.txt 2>/dev/null

9.Shell expr命令:进行整数计算

它除了可以实现整数计算,还可以结合一些选项对字符串进行处理,例如计算字符串长度、字符串比较、字符串匹配、字符串提取等

[c.biancheng.net]$ expr 2 +3 #错误:加号和 3 之前没有空格

expr: 语法错误

[c.biancheng.net]$ expr 2 + 3 #这样才是正确的

5

[c.biancheng.net]$ expr 4 * 5 #错误:乘号没有转义

expr: 语法错误

[c.biancheng.net]$ expr 4 \* 5 #使用 \ 转义后才是正确的

20

[c.biancheng.net]$ expr ( 2 + 3 ) \* 4 #小括号也需要转义

bash: 未预期的符号 `2' 附近有语法错误

[c.biancheng.net]$ expr \( 2 + 3 \) \* 4 #使用 \ 转义后才是正确的

20

[c.biancheng.net]$ n=3

[c.biancheng.net]$ expr n + 2 #使用变量时要加 $

expr: 非整数参数

[c.biancheng.net]$ expr $n + 2 #加上 $ 才是正确的

5

[c.biancheng.net]$ m=7

[c.biancheng.net]$ expr $m \* \( $n + 5 \)

56

[c.biancheng.net]$ m=5

[c.biancheng.net]$ n=`expr $m + 10`

[c.biancheng.net]$ echo $n

15

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值