Bash 实例

清空日志

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

# 初始化一个变量
LOG_DIR=/var/log

cd $LOG_DIR

cat /dev/null > wtmp

echo "Logs cleaned up."

exit

cat /dev/null > wtmp 可以换为 : > wtmp
遇到权限不够的提示,为什么,如何解决?
权限不够加 sudo 啊,可是你会发现

sudo cat /dev/null > /var/log/wtmp 一样会提示权限不够,为什么呢?因为 sudo 只能让 cat 命令以 sudo 的权限执行,而对于>这个符号并没有 sudo 的权限,我们可以使用

sudo sh -c "cat /dev/null > /var/log/wtmp " 让整个命令都具有 sudo 的权限执行
为什么 cleanlogs.sh 可以将 log 文件清除?
因为/dev/null ,里面是空的,重定向到 /var/log/wtmp 文件后,就清空了 wtmp 文件的内容。

题目一

写一个脚本

(1) 提示用户输入一个字符串;
(2) 判断:如果输入的是 quit,则退出脚本;否则,则显示其输入的字符串内容;

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

read -t 10 -p "Please enter string: " inputStr
case $inputStr in
quit)
exit 1
;;
*)
echo "$inputStr"
;;
esac

题目二

有一个8升的瓶子装满水,还有一个5升的空瓶子和一个3升的空瓶子。要求将水分成两个4升。

运行脚本之后要生产类似这样的解决方案:

1
2
3
4
5
6
7
8
9
10
Your containers: 8     5     3

Solution1 step0: 8-->0-->0
Solution1 step1: 3-->5-->0
Solution1 step2: 3-->2-->3
Solution1 step3: 6-->2-->0
Solution1 step4: 6-->0-->2
Solution1 step5: 1-->5-->2
Solution1 step6: 1-->4-->3
Solution1 step7: 4-->4-->0

提示:上述题目的解法不唯一,你只需要通过流程控制来实现其中的一种就可以了。(注意题中所给的解法,它其实是重复进行的。只有 step3 -> step4 是需要单独注意的。)

题目三

三角输出

编写 bash 脚本输出如图的三角

6-10-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash
for((i=1;i<=5;i++))
do

spaceNum=$((5-$i))
num=$((2*$i-1))

for ((j=1; j<=$spaceNum; j++))
do
echo -n ' '
done

for ((k=1; k<=$num; k++))
do
echo -n '*'
done

for ((l=1; j<=$spaceNum; l++))
do
echo -n ' '
done

echo ''

done

bash挑战-最大值

目标
新建一个 test.sh,判断 8 4 5 三个数字的最大值

输出
最大值

提示
文件创建在/home/shiyanlou/下
参考代码
注意:请务必先独立思考获得 PASS 之后再查看参考代码,直接拷贝代码收获不大

此题解法不唯一,这里只是给出其中一种作为参考。

/home/shiyanlou/test.sh 参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
max=0
a=8
b=4
c=5
for i in $a $b $c
do
if [ $i -gt $max ]
then
max=$i
fi
done
echo $max

bash挑战-偶数之和

目标

新建 test.sh 求 100 以内所有偶数之和

输出

和的值

提示

文件创建在 /home/shiyanlou/ 下

参考代码

此题解法不唯一,这里只是给出其中一种作为参考。

/home/shiyanlou/test.sh 的参考代码:

1
2
3
4
5
6
7
8
9
#!/bin/bash
cnt=0
sum=0
for cnt in `seq 2 2 100`
do
sum=$((cnt+sum))
done

echo $sum

seq 2 2 100 表示列出 1 到 100 的所有偶数

三、思考

猜数字游戏:

首先让系统随机生成一个数字,给这个数字一个范围,让用户猜数字,对输入作出判断,并且给出提示。

请用 while 语句实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash

function randNum(){
while :
do
read aNum
if test $aNum -eq $1
then
echo "right"
break 1
else
if [ $aNum -gt $1 ]
then
echo "The answer is smaller than yours."
else
echo "The answer is bigger than yours."
fi
fi
done
}

randNum $(($RANDOM%100+1))