问题:
我想在顶层目录下编写一个脚本来调用自录下的clean.sh文件,该如何实现?
第一种情况:
假设目录结构为:
fme/
|__clean.sh
|__dc250/clean.sh
|__dc300/clean.sh
|__dc350/clean.sh
现在我在fme结构下编写一个clean.sh文件调用各个子目录下的clean.sh文件。
实现方法如下:
#!/bin/bash
for
dir
in
`ls .`
do
if [ - d $dir ]
then
echo $dir
cd $dir
. clean.sh
cd ..
fi
done
do
if [ - d $dir ]
then
echo $dir
cd $dir
. clean.sh
cd ..
fi
done
这里需要学习的是if的判断语句。
文件表达式
if [ -f file ] 如果文件存在
if [ -d ... ] 如果目录存在
if [ -s file ] 如果文件存在且非空
if [ -r file ] 如果文件存在且可读
if [ -w file ] 如果文件存在且可写
if [ -x file ] 如果文件存在且可执行
整数变量表达式
if [ int1 -eq int2 ] 如果int1等于int2
if [ int1 -ne int2 ] 如果不等于
if [ int1 -ge int2 ] 如果>=
if [ int1 -gt int2 ] 如果>
if [ int1 -le int2 ] 如果<=
if [ int1 -lt int2 ] 如果<
字符串变量表达式
If [ $a = $b ] 如果string1等于string2
字符串允许使用赋值号做等号
if [ $string1 != $string2 ] 如果string1不等于string2
if [ -n $string ] 如果string 非空(非0),返回0(true)
if [ -z $string ] 如果string 为空
if [ $sting ] 如果string 非空,返回0 (和-n类似)
此问题就这样解决了。
还学习到了一个遍历所有子目录的表达方式:
find . -type d | while read dir; do echo $dir; done
第二种情况:
第一种情况是两层次的目录是父子关系,因此可以上面的方法实现。若两个层次上的目录并不是直接的父子关系,这时候在用上面的方法显然不合适。这里采用更加简洁的方法,第一种情况亦可以用。
#
!/
bin
/
bash
for dir in `find . - name clean.sh`
do
path = `dirname $dir`
if [ $path != . ]
then
echo $path
cd $path
. clean.sh
cd -
fi
for dir in `find . - name clean.sh`
do
path = `dirname $dir`
if [ $path != . ]
then
echo $path
cd $path
. clean.sh
cd -
fi
done
学习点:
搜索某个文件:
find . -name clean.sh
提取出路径名
dirname path
字符串判断
if [ $path != . ] ; 原来点就可以直接作为字符串