Unix/Linux基础课老师终于出了有意思点的题目——两道bash编程题。看似很简单,但实际操作时层出不穷的小bug还是折腾了我2个多小时。就算看得再熟,还是得经过实际操作才行啊(学会用set -x 和 bash -x 进行调试也很重要)。

这里贴一下题目和解答,顺便测试下 Windows Live Writer 的代码高亮插件(之前用的“代码插入插件”很烂很坑爹,换了一个“Insert Code for Windows Live Writer”还不错,只是没有适合bash的高亮模式)。

编程环境:CentOS / Vim

1.编写一段SHELL脚本程序,可以从键盘读取3个10到30之间的整数到变量a,b,c,,并且计算出(a+b)*c的值,当输入值不满足要求时,要给用户相应的提示,并且要求用户重新输入。

思路:用while循环检测赋值,关键在shift。(由于bash的语法,第四行exit后面的这个分号是必须的,并且最后的大括号必须使用空格分隔

源代码:

#/bin/bash
#USAGE:$0 num1 num2 num3

[ $# -ne 3 ] && { echo "Please enter three numbers !" ; exit ; }

func () {
while [ $# -gt 0 ]
do
    [ $1 -lt 10 -o $1 -gt 30 ] && { echo "$1 is wrong ! Please enter the number that betweent 10 and 30 !" ; exit ; }
    shift
done
}

func $1 $2 $3
echo "(a+b)*c=$(expr \( $1 + $2 \) \* $3)"

运行截图:

abc.jpg

2.写一个shell脚本,要求用户输入源目录和目标目录,然后列出源目录下所有的文件,并将这些文件拷贝到目标目录,并在文件名后面加上时间戳。

思路:cp –r 递归复制。

源代码:

#/bin/bash
#USAGE:$0 source_dir target_dir
#PLEASE USE THE ABSOLUTE PATH

target=$2
ls $1

func () {
while [ $# -gt 0 ]
do
    cp -r $1 $target/$1_$(date '+%y%m%d')
    shift
done
}

cd $1
func *

运行截图:

cp.jpg