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脚本语言是命令的堆砌,即按照实际需要,结合命令流程机制实现的 ...
随机推荐
- .net core 认证与授权(三)
前言 在写三上是在一的基础上写的,所以有没有看过二是没得关系的,在一中介绍了认证与授权,但是没有去介绍拿到证书后怎样去验证授权. 概念性东西:在这套机制中,把这个权限认证呢,称作为policy.这个p ...
- 【读书笔记】关于《精通C#(第6版)》与《C#5.0图解教程》中的一点矛盾的地方
志铭-2020年2月8日 03:32:03 先说明,这是一个旧问题,很久很久以前大家就讨论了, 哈哈哈,而且先声明这是一个很无聊的问题,
- js代码预解析
1.var一般用于声明变量,预解析代码的时候,等号后面的赋值过程不会执行,所以预解析时的var变量都是未定义的 2.function声明的函数,预解析的时候,值就是函数里面的内容 例:console. ...
- C语言的体系结构--main函数存在的必然性(听杨力祥老师的课)
注:不是原创,课堂上听来的,防止遗忘,所以记下来! C语言包括两个部分:数据和函数,当然最终这两个部分都是要进入到计算机的内存中去. 函数在编译后生成可执行代码,存放在代码区:数据分为几种:局部与全局 ...
- Ansi、Unicode、UTF8字符串之间的转换和写入文本文件
转载请注明出处http://www.cppblog.com/greatws/archive/2008/08/31/60546.html 最近有人问我关于这个的问题,就此写一篇blog Ansi字符串我 ...
- 详解python的装饰器decorator
装饰器本质上是一个python函数,它可以让其它函数在不需要任何代码改动的情况下增加额外的功能. 装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志,性能测试,事务处理,缓存, ...
- DOCKER 学习笔记9 Kubernetes (K8s) 生产级容器编排 上
前言 在上一节的学习中.我们已经可以通过最基本的 Docker Swarm 创建集群,然后在集群里面加入我们需要运行的任务 以及任务的数量 这样我们就创建了一个服务. 当然,这样的方式在我们本地虚拟机 ...
- Property - 特性(Python)
Property - Python 特性 不同的书籍对 property 一词的翻译有所不同, 我们将 property 翻译成 '特性' 以区别于 attribute 一词. 先看看 propert ...
- C语言三(2)
多重 if...else....else 结构 语法: if(条件1) { 语句1; } else if(条件2) { 语句2; } else if(条件3) { 语句3; } else { 语句N; ...
- Redis入门(介绍、搭建)——Windows、Centos环境
一.介绍 Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cac ...