Bash脚本编程学习笔记05:用户交互与脚本调试

用户交互

在《学习笔记04》中我们有提到位置参数,位置参数是用来向脚本传递参数的一种方式。还有一种方式,是read命令。

[root@c7-server ~]# read name
alongdidi
[root@c7-server ~]# echo $name
alongdidi

read命令可以实现从STDIN中读取数据存入用户指定的变量中。

可以多变量赋值。

[root@c7-server ~]# read a b
tom jerry
[root@c7-server ~]# echo $a $b
tom jerry

当变量数量多于值数量时,多余的变量值为空。

复制代码
[root@c7-server ~]# read a b c
tom jerry
[root@c7-server ~]# echo $a
tom
[root@c7-server ~]# echo $b
jerry
[root@c7-server ~]# echo $c

[root@c7-server ~]#
复制代码

当值数量多于变量数量时,多余的值会被全部赋值给最后一个变量。

[root@c7-server ~]# read a b
tom jerry mike
[root@c7-server ~]# echo $a
tom
[root@c7-server ~]# echo $b
jerry mike

可以通过-p选项实现提醒信息,使得整个用户交互更加人性化。

[root@c7-server ~]# read -p "Please enter your name:" name
Please enter your name:alongdidi
[root@c7-server ~]# echo $name
alongdidi

如果用户不输入的话,那么read命令就会一直保持在那里,除非用户输入或者键入Ctrl+c中断。可通过-t选项指定一个超时的时长(单位:秒),这样子会使得其更加安全,类似于网站登录凭证的超时机制。

[root@c7-server ~]# read -p "Please enter your name:" name
Please enter your name:^C
[root@c7-server ~]# read -t 3 -p "Please enter your name:" name
Please enter your name:[root@c7-server ~]# 
[root@c7-server ~]#

 

脚本调试

我们可以使用2个选项来对脚本进行调试。

# bash -n test.sh
# bash -x test.sh

其实这两个选项在man bash中是无法找到的,因为它们不属于bash的选项,而是属于set。set的一些单字符选项(短选项)可以被bash使用,-n和-x就是其中的2个。

-n:类似于语法检测。如果脚本语法没问题的话,就不会报错。退出状态码为0。

复制代码
[root@c7-server ~]# cat test.sh 
#!/bin/bash
if id zwl &> /dev/null; then
    echo "User zwl exists."
else
    echo "User zwl doesn't exists."
fi
[root@c7-server ~]# bash -n test.sh
[root@c7-server ~]# echo $?
0
复制代码

如果我们将fi注释掉,破坏了if语句的结构体。则会报错。

复制代码
[root@c7-server ~]# cat test.sh 
#!/bin/bash
if id zwl &> /dev/null; then
    echo "User zwl exists."
else
    echo "User zwl doesn't exists."
#fi
[root@c7-server ~]# bash -n test.sh 
test.sh: line 7: syntax error: unexpected end of file
[root@c7-server ~]# echo $?
2
复制代码

但是这个语法检测本身能力其实挺弱的,比如我们将else修改掉。此时语法检测并没有报错。

因为它将原本双分支的if结构体理解成了单分支,并且将elsealongdidi理解为命令,并且不会去查询该命令是否存在。

复制代码
[root@c7-server ~]# cat test.sh 
#!/bin/bash
if id zwl &> /dev/null; then
    echo "User zwl exists."
elsealongdidi
    echo "User zwl doesn't exists."
fi
[root@c7-server ~]# bash -n test.sh 
[root@c7-server ~]# echo $?
0
复制代码

所以这个案例中,即便语法检测没问题,脚本在执行的时候依然会报错。

[root@c7-server ~]# bash test.sh 
User zwl exists.
test.sh: line 4: elsealongdidi: command not found
User zwl doesn't exists.

因此该语法检测,只是确保脚本是否可以执行,至于执行过程中出现的任何错误,只要不导致脚本无法继续执行,就没关系。

-x:追踪脚本的执行过程。在遇到条件结构体时可用于理解脚本执行了哪个分支。在遇到循环结构体时,也可以看明白循环了几次等。

复制代码
[root@c7-server ~]# cat test.sh
#!/bin/bash
if id zwl &> /dev/null; then
    echo "User zwl exists."
else
    echo "User zwl doesn't exists."
fi
[root@c7-server ~]# bash -x test.sh
+ id zwl
+ echo 'User zwl exists.'
User zwl exists.
复制代码
posted @   阿龙弟弟  阅读(394)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2019-01-08 rsync基础
回到顶部
点击右上角即可分享
微信分享提示

目录导航