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 -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 $?
如果我们将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 : syntax error: unexpected end of file
[root@c7-server ~]# echo $?
但是这个语法检测本身能力其实挺弱的,比如我们将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 $?
所以这个案例中,即便语法检测没问题,脚本在执行的时候依然会报错。
[root@c7-server ~]# bash test.sh
User zwl exists.
test.sh: line : 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.
Bash脚本编程学习笔记05:用户交互与脚本调试的更多相关文章
- Bash脚本编程学习笔记08:函数
官方资料:Shell Functions (Bash Reference Manual) 简介 正如我们在<Bash脚本编程学习笔记06:条件结构体>中最后所说的,我们应该把一些可能反复执 ...
- Bash脚本编程学习笔记07:循环结构体
本篇中涉及到算术运算,使用了$[]这种我未在官方手册中见到的用法,但是确实可用的,在此前的博文<Bash脚本编程学习笔记03:算术运算>中我有说明不要使用,不过自己忘记了.大家还是尽量使用 ...
- Bash脚本编程学习笔记06:条件结构体
简介 在bash脚本编程中,条件结构体使用if语句和case语句两种句式. if语句 单分支if语句 if TEST; then CMD fi TEST:条件判断,多数情况下可使用test命令来实现, ...
- Bash脚本编程学习笔记04:测试命令test、状态返回值、位置参数和特殊变量
我自己接触Linux主要是大学学习的Turbolinux --> 根据<鸟哥的Linux私房菜:基础篇>(第三版) --> 马哥的就业班课程.给我的感觉是这些课程对于bash的 ...
- bash脚本编程学习笔记(二)
1.脚本编程之函数 函数是实现结构化编程重要的思想,主要目的是实现代码重用 定义一个函数: function FUNCNAME { command //函数体 } FUNCNAME(){ //函数 ...
- 【Linux_Shell 脚本编程学习笔记二、打印菜单】
综合实例: 打印选择菜单,一键安装Web服务 [root@zuoyan script]# sh menu.sh 1.[install lamp] 2. [install lnmp] 3. [ex ...
- Javascript高级编程学习笔记(43)—— 动态脚本
动态脚本 大多数情况下,DOM操作都很简洁明了 因为DOM主要就是用来操作页面中的可视节点的 但有些时候我们又希望可以动态的来进行DOM操作 其中的一部分也就是今天我们的内容动态脚本 动态脚本是什么意 ...
- 【Linux_Shell 脚本编程学习笔记一、条件表达式】
条件表达式返回的结果都为布尔型 真为1,假为0 条件测试的表达式 [expression] 比较符 整数比较 -eq:比较两个整数是否相等,$A -eq $B -ne:测试两个整数是否不等,不等则为真 ...
- bash脚本编程学习笔记(一)
bash脚本语言,不同于C/C++是一种解释性语言.即在执行前不需要事先转变为可执行的二进制代码,而是每次执行时经解释器解释后执行.bash脚本语言是命令的堆砌,即按照实际需要,结合命令流程机制实现的 ...
随机推荐
- apace访问403错误的解决方法汇总
作为一个努力学习的实习生,遇到问题还是靠记录才能更好的学习. 首先附上故障图 翻译过来就是啥呢? 于是天真的我去百度了一下大神们的解决方法,目录没权限嘛,来个777就完事了.一开始还觉得挺合乎情理的, ...
- 浅谈构建前端自动化工作流程一 之 nvm
1.NVM简介 我们可能同时在进行2个项目,而2个不同的项目所使用的node版本又是不一样的,或者是要用更新的node版本进行试验和学习.这种情况下,对于维护多个版本的node将会是一件非常麻烦的事情 ...
- 8.HanLP实现--命名实体识别
笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 8. 命名实体识别 8.1 概述 命名实体 文本中有一些描述实体的词汇.比如人名. ...
- C++ STL IO流 与 Unicode (UTF-16 UTF-8) 的协同工作
09年研究技术的大神真的好多,本文测试有很多错误,更正后发布下(可能与编辑器相关). file.imbue(locale(file.getloc(), new codecvt_utf8<wcha ...
- 使用PyCharm创建并运行一个Python项目
(1)首先,在欢迎界面点击“Create New Project”: (2)在“New Project“左侧面板点击”Pure Python“,右侧Location选择自己要创建项目的路径(一般情况, ...
- Codeforces_820
A.直接模拟. #include<bits/stdc++.h> using namespace std; int c,v0,v1,a,l; int main() { ios::sync_w ...
- Codeforces_723
A.取中间那个点即可. #include<bits/stdc++.h> using namespace std; ]; int main() { ios::sync_with_stdio( ...
- PC微信逆向--实现消息防撤回
自从聊天软件消息撤回功能问世后,对于撤回的消息,我们对它一直有种强烈的好奇感."Ta刚撤回了什么?是骂我的话?还是说喜欢我?还是把发给其他人的消息误发给了我?好气呀,都看不到了...&quo ...
- 06-Spring03-事务管理
今日知识 1. Spring事务管理 2. 转账案例 Spring事务管理 1. 事务特性(ACID) 1. 原子性:整体 [原子性是指事务包含的所有操作要么全部成功,要么全部失败] 2. 一致性:数 ...
- 20191231--python学习第五天
1.内容回顾与补充 int类型 (1)py2与py3的区别 (2)除法 (3)强制转换 int('字符串') [重要] int(布尔值):返回的结果只有0和1 bool类型 (1)强制转换: bool ...