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

练习题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}

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

猜你喜欢

转载自blog.csdn.net/Android_xue/article/details/85221590