练习题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}
但还是建议用第一种方式,毕竟简单