# 本章练习

# 第 1 题

编写 script,执行 scipt 时,可以显示:

  1. 你目前的身份(可使用 whoami 指令)
  2. 你目前所在的目录(可使用 pwd)
#!/bin/bash
echo "当前登录账户为:$(whoami)"
echo "当前所在路径为:$(pwd)"
1
2
3

测试输出信息

[mrcode@study bin]$ ./q1.sh 
当前登录账户为:mrcode
当前所在路径为:/home/mrcode/bin
1
2
3

# 第 2 题

编写 script,实现,你还有几天可以过生日

程序设计:

  1. 让用户输入自己的生日,比如 0201
  2. 程序计算出当前时间与指定时间的天数

思路分析:

  1. 可以通过 date +%y%m%d 获取当前时间
  2. 可以通过 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

测试输出信息

[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

这里的结果对于不满一天的忽略了处理

# 第 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

测试如下

[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

# 第 4 题

编写脚本,实现以下功能:

  1. 查看 /root/test/logical 文件是否存在
  2. 如果不存在,创建它,并离开。(可使用 touch 创建)
  3. 如果存在的话,判断是否为文件?则删除后建立一个 logical 的目录,并离开
  4. 如果存在的话,判断是否为目录?则删除此目录
#!/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

测试输出

[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

# 第 5 题

将 /etc/passwd 的第一栏取出,而且每一栏都以一行字符串「The 1 account is "root"」

思路:

  1. /etc/passwd 中第一栏是账户名
  2. 每一行以冒号「:」分割,可以使用 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