# 本章练习
# 第 1 题
编写 script,执行 scipt 时,可以显示:
- 你目前的身份(可使用 whoami 指令)
- 你目前所在的目录(可使用 pwd)
#!/bin/bash
echo "当前登录账户为:$(whoami)"
echo "当前所在路径为:$(pwd)"
1
2
3
2
3
测试输出信息
[mrcode@study bin]$ ./q1.sh
当前登录账户为:mrcode
当前所在路径为:/home/mrcode/bin
1
2
3
2
3
# 第 2 题
编写 script,实现,你还有几天可以过生日
程序设计:
- 让用户输入自己的生日,比如 0201
- 程序计算出当前时间与指定时间的天数
思路分析:
- 可以通过
date +%y%m%d
获取当前时间 - 可以通过
date --date="YYYYMMDD" +%s
把字符串转换成秒
#!/bin/bash
reda -p "请输入你的生日,格式为 MMDD,如 > 0201 :" bir
now=$(date +%m%d)
echo "当前日期为 $now"
if [ "$now" == "$bir" ]; then
echo “今天是您的生日”
exit 1
fi
# 当生日还未到来,则直接计算
year=`date +%Y` # 默认年份为今年
if [ "$bir" -lt "$now" ]; then
year=$((`date +%Y`+1)) # 当所选时间小于当前时间,则将年份增加 1 年,因为今年生日已经过去了
fi
# 开始计算两个时间相差多少天,未来的生日时间 - 当前秒数
total_s=$((`date --date="$year$bir" +%s` - `date +%s`))
total_d=$(($total_s/60/60/24))
echo "你的生日还有 $total_d 天"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
测试输出信息
[mrcode@study bin]$ ./q2.sh
请输入你的生日,格式为 MMDD,如 > 0201 :0201
当前日志为:0213
你的生日还有 353 天
[mrcode@study bin]$ ./q2.sh
请输入你的生日,格式为 MMDD,如 > 0201 :0215
当前日期为 0213
你的生日还有 1 天
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
这里的结果对于不满一天的忽略了处理
# 第 3 题
编写脚本,让用户输入一个数字,程序可以由 1+2+3... 一直累加到用户输入的数字为止
#!/bin/bash
read -p "请输入一个数字,将计算从 1 累加到该数的结果,如 1+2+..+ 你输入的数字 = 累加结果:" n
if [ "$n" -le 1 ]; then
echo "请输入一个大于 1 的数字"
exit 1
fi
total=0
for i in $(seq 1 $n)
do
total=$(($total+$i))
done
echo "1+...+ $n = $total"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
测试如下
[mrcode@study bin]$ ./q3.sh
请输入一个数字,将计算从 1 累加到该数的结果,如 1+2+..+ 你输入的数字 = 累加结果:0
请输入一个大于 1 的数字
[mrcode@study bin]$ ./q3.sh
请输入一个数字,将计算从 1 累加到该数的结果,如 1+2+..+ 你输入的数字 = 累加结果:2
1+...+ 2 = 3
[mrcode@study bin]$ ./q3.sh
请输入一个数字,将计算从 1 累加到该数的结果,如 1+2+..+ 你输入的数字 = 累加结果:10
1+...+ 10 = 55
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 第 4 题
编写脚本,实现以下功能:
- 查看 /root/test/logical 文件是否存在
- 如果不存在,创建它,并离开。(可使用 touch 创建)
- 如果存在的话,判断是否为文件?则删除后建立一个 logical 的目录,并离开
- 如果存在的话,判断是否为目录?则删除此目录
#!/bin/bash
dir="/root/test"
fileName="logical"
filePath="$dir/$fileName"
if [ -e "$filePath" ]; then # 如果存在
if [ -d "$filePath" ]; then
echo "$filePath 是一个目录,删除此目录"
rm -rf "$filePath"
exit 1
elif [ -f "$filePath" ]; then
echo "$filePath 是一个文件,删除它,并创建成一个目录"
rm -rf "$filePath"
mkdir $filePath
exit 1
fi
else # 如果不存在
echo "$filePath 文件不存在,创建空文件"
touch "$filePath"
exit 1
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
测试输出
[root@study ~]# mkdir /root/test/ # 由于该目录不存在,需要手动创建,并且 root 目录下,普通用户权限不够,也需要切换到 root 账户来执行
[root@study ~]# /home/mrcode/bin/q4.sh
/root/test/logical 文件不存在,创建空文件
[root@study ~]# /home/mrcode/bin/q4.sh
/root/test/logical 是一个文件,删除它,并创建成一个目录
[root@study ~]# /home/mrcode/bin/q4.sh
/root/test/logical 是一个目录,删除此目录
1
2
3
4
5
6
7
2
3
4
5
6
7
# 第 5 题
将 /etc/passwd 的第一栏取出,而且每一栏都以一行字符串「The 1 account is "root"」
思路:
- /etc/passwd 中第一栏是账户名
- 每一行以冒号「:」分割,可以使用 cut -d ":" 来获取;
cut -d ":" -f1 /etc/passwd
#!/bin/bash
accounts=$(cut -d ":" -f1 /etc/passwd)
for account in $accounts
do
declare -i i=$i+1 # 定义当前顺序
echo "The $i account is $account"
done
1
2
3
4
5
6
7
2
3
4
5
6
7