shell map 及文件的遍历
最近遇到这么一个小作业,需要遍历某个文件下的所有文件(只遍历一层文件夹),一旦找到任一对应的文件,则执行对应的命令,之后边退出命令,为了解决该问题:
- 首先是文件的遍历
- 可以添加多个文件及其对应的命令,所有需要参数解析添加到map下,组成kv结构。
代码:
#!/bin/bash
set -e
function getdir() {
for element in $(ls $1); do
dir_or_file=$1"/"$element
if [ -d $dir_or_file ]; then
getFile $dir_or_file
else
getFile $1
fi
done
}
function getFile() {
execPath=$1
for element in $(ls $1); do
filePath=$1"/"$element
if [ -f $filePath ]; then
for key in ${!map[@]}; do
if [ "$element" == "$key" ]; then
cd $execPath
echo "find file: $key ,path is :$filePath"
echo "执行命令:${map[$key]} ......"
${map[$key]}
exit 0
fi
done
fi
done
}
function parseArgs() {
index=0
arr[0]=a
for a in "$@"; do
arr[$index]=$a
let index+=1
done
for ((i = 1; i < $#; i = i + 2)); do
key=${arr[$i]}
value=${arr[$(($i + 1))]}
map["$key"]="$value"
echo "文件——>命令:$key——>${map[$key]}"
done
}
function printHelp() {
echo "---------------------------------------------------------------"
echo "用法示例: ./findFile.sh [path] [fileName] [command] ...."
echo "----------------------------------------------------------------"
}
# declare -A map=(["build.gradle"]="gradle -b build.gradle clean && gradle -b build.gradle build" ["pom.xml"]="mvn -f pom.xml clean && mvn -f pom.xml package")
declare -A map=()
# 不小于3个参数
if [ $# -lt 3 ]; then
echo "参数个数太少"
printHelp
exit 1
else
parseArgs "$@"
getdir $1
fi
测试:
./findfile.sh /go/src/sacc main.go “go build”
注:
- 对于又空格的参数,可以用”“ 括起来
- 在解析带空格的参数是,需要直接用”s@“ ,如果将其赋值,比如:args=s@ ,之后用”$args“ 也是不对的