Shell脚本编程之(二)简单的Shell脚本练习

小编 2026-06-22 阅读:1080 评论:0
练习题1:交互式脚本(用户决定变量内容) 代码 [root@node01 bin]$ vim showname.sh #!/bin/bash # Program: # User inp...

练习题1:交互式脚本(用户决定变量内容)

代码

[root@node01 bin]$  vim showname.sh
#!/bin/bash
# Program:
#  User inputs his first name and last name. Program shows his full name.
# History:
# 2018/22/23  Rivers  First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p \"Please input your first name: \" firstname # 提示使用者输入
read -p \"Please input your last name: \" lastname # 提示使用者输入
echo -e \"\\nYour full name is: ${firstname} ${lastname}\" # 结果由屏幕输出

测试

[root@node01 bin]# vim showname.sh 
[root@node01 bin]# sh showname.sh 
Please input your first name: Rivers
Please input your last name: Xue

Your full name is: Rivers Xue

讲解

bash有很多内部指令,这些指令需要自己通过man去慢慢学习。
而这里刚好用到read和echo,所以先简单说一下这两个内部命令的简单用法

  • read
    读取来自键盘输入的变量
    -p :这个参数可以更友好的给用户一些提示,如果啥都不加,让用户直接输入,用户并清楚该输入什么
  • echo
    读取变量

练习题2:随着日期变化(利用date进行文件建立)

代码

[root@node01 bin]$  vim create_3_filename.sh
#!/bin/bash
# Program:
#  Program creates three files, which named by user\'s input and date command.
# History:
# 2018/12/22  Rivers  First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# 1. 让使用者输入文件名,并取得 fileuser 这个变量;
echo -e \"I will use \'touch\' command to create 3 files.\" # 纯粹显示信息
read -p \"Please input your filename: \" fileuser # 提示使用者输入
# 2. 为了避免使用者随意按 Enter ,利用变量功能分析档名是否有设定?
filename=${fileuser:-\"filename\"} # 开始判断有否配置文件名
# 3. 开始利用 date 指令来取得所需要的档名了;
date1=$(date --date=\'2 days ago\' +%Y%m%d) # 前两天的日期
date2=$(date --date=\'1 days ago\' +%Y%m%d) # 前一天的日期
date3=$(date +%Y%m%d) # 今天的日期
file1=${filename}${date1} # 底下三行在配置文件名
file2=${filename}${date2}
file3=${filename}${date3}
# 4. 将档名建立吧!
touch \"${file1}\" # 底下三行在建立文件
touch \"${file2}\"
touch \"${file3}\"

测试

[root@node01 bin]# sh create_3_filename.sh 
I will use \'touch\' command to create 3 files.
Please input your filename: tb_
[root@node01 bin]# ll
total 12
-rw-r--r-- 1 root root 1062 Dec 21 09:58 create_3_filename.sh
-rwxr-xr-x 1 root root  243 Dec 20 16:21 hello.sh
-rw-r--r-- 1 root root  456 Dec 21 09:39 showname.sh
-rw-r--r-- 1 root root    0 Dec 21 09:58 tb_20181219
-rw-r--r-- 1 root root    0 Dec 21 09:58 tb_20181220
-rw-r--r-- 1 root root    0 Dec 21 09:58 tb_20181221

讲解

  • date
    打印或设置系统日期和时间
    参数:
    –date 这个参数后的字符串真的是比较随意的,比如上上面写的2 days ago,系统就能知道是两天之前

练习题3:数值运算(简单的加减乘除)

代码

[root@node01 bin]$ 
#!/bin/bash
# Program:
#  User inputs 2 integer numbers; program will cross these two numbers.
# History:
# 2018/12/22  Rivers  First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e \"You SHOULD input 2 numbers, I will multiplying them! \\n\"
read -p \"first number: \" firstnu
read -p \"second number: \" secnu
total=$((${firstnu}*${secnu}))
echo -e \"\\nThe result of ${firstnu} x ${secnu} is ==> ${total}\"

测试

[root@node01 bin]# sh multiplying.sh 
You SHOULD input 2 numbers, I will multiplying them! 

first number: 2
second number: 3

The result of 2 x 3 is ==> 6

讲解

首先我们知道只有整数变量才能进行计算,而bash中也仅仅支持整数

我们需要特别注意一下total这个变量的赋值格式

var=$((运算内容))

如果我们不使用这样的格式,而是直接用

total=${firstnu}*${secnu}

会出现什么效果呢?
测试一波

[root@node01 bin]# sh multiplying.sh 
You SHOULD input 2 numbers, I will multiplying them! 

first number: 2
second number: 3

The result of 2 x 3 is ==> 2*3

哈哈,这个很明显优点搞笑了,为什么会这样?就是因为你输入的数据bash根本不知道是整数,所以它就不会自动计算了,除非你声明它们是整数,或者声明total为整数
比如:

declare -i total=${firstnu}*${secnu}

但还是建议用第一种方式,毕竟简单

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表