shell map

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“ 也是不对的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值