我有一个包含所有tgz
文件的目录。目前,我有一个正在运行的脚本,它将
- 将目录作为第一个参数
- 提取
tgz
-
cd
到解压缩的文件夹中 - 然后运行我的加载脚本
- 然后继续下一个TGZ。
所 示。
目前这个脚本可以工作,但如果有人输入目录名称以外的参数(例如,./myScript/whole/path/to/directory),它将失败
dirname=$1
cur_dir=`pwd`
echo The directory you are about to extract is $dirname
echo $(ls ${cur_dir}/${dirname}/*.tgz)
echo Your current directory is ${cur_dir}
for tgz in $(ls ${cur_dir}/${dirname}/*.tgz) ; do # <---- I think there is a better way of doing this please advise
echo the tgz you are about to extract now is ${tgz}
cd ${dirname}; #cd into input directory
tar -xvzf ${tgz}; #extract tgz
cd ${tgz%%.tgz}; #cd into the folder you extracted
loadItExit; #run my other script to load
cd ../..; #move up two levels back to original path
done
看起来像这样的东西可以工作
dirname="$1"
for tgz in $(ls ${dirname}/*.tgz) ; do
echo "tar -xzf ${tgz}";
echo "cd ${tgz%%.tgz}";
echo "LoadIt";
echo "cd ..";
done
显然回声只是为了演示
如果您无法控制环境,避免使用 ls
的注释是公平的。将感兴趣的文件的筛选器进一步推送到不太具体的集合上的循环中。
根据你的控制程度,你可能需要更多的偏执测试。
dirname="$1"
for tgz in ${dirname}/* ; do
if [ "${tgz##*.}" == "tgz" ] then
echo "tar -xzf ${tgz}";
echo "cd ${tgz%%.tgz}";
echo "LoadIt";
echo "cd ..";
fi
done
编辑评论以解释if
声明
首先,bash 中的字符[
与 test
命令相同您想在[
之后和之前保留空格]
在[
里面... ]
是表达式(谓词)评估结果为 true
或false
在本例中,我们使用变量替换
其中外壳变量的值$tgz
此处,
在使用前正在修改
将变量名称括起来始终是最安全的在戴着牙套$
后{
... }
但是,这样做也允许您注释变量调用
将普通变量值替换为修改后的值
我快速而肮脏的记忆记符,用于记住注释
它们的功能是看向$
键
的任一侧(对不起,非英语非QWERTY键盘布局)
并注意哈希或井号字符#
继续$
所以${name#<regexp>}
将删除第一个匹配项
的正则表达式<regexp>
#
之后和}
之前从变量值的开头开始。
同样,%
是$
和${name%<regexp>}
之后的关键将删除正则表达式
的最后一个匹配项从变量的值
两个注释都可以加倍##
或%%
表示:
删除正则表达式
的最长匹配项而不是最短的。
所以"${tgz##*.}" == "tgz"
意味着删除所有内容,包括最后一个点
从变量中的值$tgz
,看看是否剩下
什么正好等于字符串"tgz"
关于"bash变量替换"
的网络搜索和"猛击测试"将带您走得更远