用户交互

在《学习笔记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:用户交互与脚本调试的更多相关文章

  1. Bash脚本编程学习笔记08:函数

    官方资料:Shell Functions (Bash Reference Manual) 简介 正如我们在<Bash脚本编程学习笔记06:条件结构体>中最后所说的,我们应该把一些可能反复执 ...

  2. Bash脚本编程学习笔记07:循环结构体

    本篇中涉及到算术运算,使用了$[]这种我未在官方手册中见到的用法,但是确实可用的,在此前的博文<Bash脚本编程学习笔记03:算术运算>中我有说明不要使用,不过自己忘记了.大家还是尽量使用 ...

  3. Bash脚本编程学习笔记06:条件结构体

    简介 在bash脚本编程中,条件结构体使用if语句和case语句两种句式. if语句 单分支if语句 if TEST; then CMD fi TEST:条件判断,多数情况下可使用test命令来实现, ...

  4. Bash脚本编程学习笔记04:测试命令test、状态返回值、位置参数和特殊变量

    我自己接触Linux主要是大学学习的Turbolinux --> 根据<鸟哥的Linux私房菜:基础篇>(第三版) --> 马哥的就业班课程.给我的感觉是这些课程对于bash的 ...

  5. bash脚本编程学习笔记(二)

    1.脚本编程之函数 函数是实现结构化编程重要的思想,主要目的是实现代码重用 定义一个函数: function FUNCNAME { command //函数体 }   FUNCNAME(){ //函数 ...

  6. 【Linux_Shell 脚本编程学习笔记二、打印菜单】

    综合实例: 打印选择菜单,一键安装Web服务 [root@zuoyan   script]# sh menu.sh 1.[install  lamp] 2. [install lnmp] 3. [ex ...

  7. Javascript高级编程学习笔记(43)—— 动态脚本

    动态脚本 大多数情况下,DOM操作都很简洁明了 因为DOM主要就是用来操作页面中的可视节点的 但有些时候我们又希望可以动态的来进行DOM操作 其中的一部分也就是今天我们的内容动态脚本 动态脚本是什么意 ...

  8. 【Linux_Shell 脚本编程学习笔记一、条件表达式】

    条件表达式返回的结果都为布尔型 真为1,假为0 条件测试的表达式 [expression] 比较符 整数比较 -eq:比较两个整数是否相等,$A -eq $B -ne:测试两个整数是否不等,不等则为真 ...

  9. bash脚本编程学习笔记(一)

    bash脚本语言,不同于C/C++是一种解释性语言.即在执行前不需要事先转变为可执行的二进制代码,而是每次执行时经解释器解释后执行.bash脚本语言是命令的堆砌,即按照实际需要,结合命令流程机制实现的 ...

随机推荐

  1. Arduino通信篇系列之print()和write()输出方式的差异

    我们都知道,在HardwareSerial类中有print()和write()两种输出方式, 两个都可以输出数据,但其输出方式并不相同. 例子: float FLOAT=1.23456; int IN ...

  2. TLS使用指南(一):如何在Rancher 2.x中进行TLS termination?

    引 言 这是一个系列文章,我们将在本系列中探索Rancher使用TLS证书的不同方式.TLS,安全传输层协议,是用于保护网络通信的加密协议.它是目前已经弃用的安全套接层(SSL)的继任者. 你可以从本 ...

  3. tf识别非固定长度图片ocr(数字+字母 n位长度可变)- CNN+RNN+CTC

    先安装必须的库 tensorflow_gpu==1.15.0 numpy opencv_python github: https://github.com/bai-shang/crnn_ctc_ocr ...

  4. LinearLayout中组件右对齐

    在LinearLayout中,如果将其定位方向设为横向排列:android:orientation="horizontal",那么这个布局中的控件将自左向右排列. 但有时会有这样的 ...

  5. 教你5分钟做个手机APP[视频]

    天天宅在家里,没什么事做,录个教学视频吧! 发到了视频网站上去根本没人看,伤心ing啊! 不知cnblogs上面是否让我发! 先上一张效果图看看哈: 如果播放不正常请点这里:https://www.b ...

  6. C# WinForm 使用SMTP协议发送QQ邮箱验证码

    文章来自:https://blog.csdn.net/IT_xiao_guang_guang/article/details/104336604 前言   在程序设计中,发送验证码是常见的一个功能,用 ...

  7. Go语言实现:【剑指offer】二叉搜索树的后序遍历序列

    该题目来源于牛客网<剑指offer>专题. 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. Go ...

  8. Yandex Big Data Essentials Week1 Unix Command Line Interface File Content exploration

    cat displays the contents of a file at the command line copies or apppend text file into a document ...

  9. php 绘制验证码 示例

    <?php header("content-type:image/jpeg"); session_start();//开启session //宽高 字体大小 $width=1 ...

  10. MySQL8.0 InnoDB并行执行

    概述 MySQL经过多年的发展已然成为最流行的数据库,广泛用于互联网行业,并逐步向各个传统行业渗透.之所以流行,一方面是其优秀的高并发事务处理的能力,另一方面也得益于MySQL丰富的生态.MySQL在 ...