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)"
运行截图:
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 *
运行截图:
学长你好, 第二个程序似乎不能把子目录下的文件也重命名了?
确实有问题,这里应该用递归。