前天接到一个小任务,写一个shell脚本,负责对文件根据日期归类统计,之前没有写过shell脚本,只知道sh文件可以直接在命令窗口执行,瞎折腾了半天,也算是完成了一半的任务(等我写好了,头儿早已经写好了),不过自己还是学习了一下,此处mark
写shell脚本,第一句话一般是#!/bin/bash,这句话是用来说明下面的脚本是在什么shell下运行的
接下来就是写自己需要的功能,如果是全局都要用到的变量,则定义为全局变量,否则,在函数内部定义local变量即可。
下面为遍历文件夹下的所有文件,有两种方式,
1、
<span style="font-family:FangSong_GB2312;font-size:12px;">function scandir() {
local cur_dir parent_dir workdir dataTime file_name
workdir=$1
dataTime=$2
cd ${workdir}
if [ ${workdir} = "/" ]
then
cur_dir=""
else
cur_dir=$(pwd)
fi
for dirlist in $(ls ${cur_dir})
do
if test -d ${dirlist}
then
cd ${dirlist}
scandir ${cur_dir}/${dirlist}
cd ..
else
f2 ${dirlist} ${dataTime}
fi
done
} </span>
下面为调用其的main函数,也就是执行该脚本是首先要执行的代码
<span style="font-family:FangSong_GB2312;font-size:12px;">if test -d $1
then
scandir $1
elif test -f $1
then
echo "you input a file but not a directory,pls reinput and try again"
exit 1
else
echo "the Directory isn't exist which you input,pls input a new one!!"
exit 1
fi </span>
2、
<span style="font-family:FangSong_GB2312;font-size:12px;">function ergodic(){
for file in `ls $1`
do
if [ -d $1"/"$file ]
then
ergodic $1"/"$file
else
local path=$1"/"$file
local name=$file
echo $path $name
fi
done
}</span>
下面为其main函数
<span style="font-family:FangSong_GB2312;font-size:12px;">if test -d $1
then
ergodic $1
elif test -f $1
then
echo "you input a file but not a directory,please reinput and try again"
exit 1
else
echo "the Directory isn't exist which you input,please input a new one!!"
exit 1
fi </span>
以上两种方法中,都是接收了一个参数,这个参数就是要遍历的目录,在脚本中,用$1表示传进来的第一个参数,依次类推,而$0表示的则是shell本身的文件名
需要注意,每个if语句都是闭合,像html中的标签一样,都是成对出现的,且if判断完之后要用then
拼接字符串的时候,不用+,直接在后面跟着就行,当要拼接复杂的字符串时,使用printf拼接,如下:
STR_TEMP=`printf "%s%s" "$STR_ZERO" "$USER_NAME"`
使用printf可以进行更复杂的拼接
在脚本中使用到shell命令是,一般是要加符号`,成对出现,将命令括起来(之前一直以为shell脚本中不能用现成品的脚本命令,需要都从底层写起呢,也是觉得自己傻的够够的了)
其实只要了解和熟悉shell脚本中的各功能所对应的都有什么命令,写脚本就是一个思路的问题
最后自己写的过程中遇到的问题:
写的函数太多,习惯了写java程序,老是觉得应该将代码按功能分块,这样可以方便复用,但是注意脚本一般来说都是直接使用的,别人不会调用你脚本中的某个函数,所以最好不要写太多函数,如果总体的代码量不大,那么按代码功能分块也没有太大必要。