我正在尝试设计一个“优雅”的解决方案来执行以下操作:
unzip applications/<abc>.zip -d applications/<abc>/
unzip applications/<def>.zip -d applications/<def>/
unzip applications/<ghi>.zip -d applications/<ghi>/
unzip applications/<jkl>.zip -d applications/<jkl>/
大括号扩展不适用,它们与我正在寻找的内容“相反”(或者我错过了什么?)。
循环是for
可行的方法吗?
我曾想过使用甚至利用历史控制(用什么东西xargs
反向引用论证);!:1
但事情很快就会变得更加复杂而不是简单。
我认为我对正则表达式反向引用有偏见; shell中是否存在类似的东西?
答案1
带有一些变量扩展规则的 for 循环可能会满足您的要求
for file in applications/*.zip
do
unzip "$file" -d "${file%.zip}"
done
该表达式的意思是“从末尾删除with${file%.zip}
的内容”。$file
.zip
所以第一次循环$file
可能会读到applications/abc.zip
,所以${file%.zip}
会读到applications/abc
。
答案2
你提到的xargs
。 xargs 命令出现在 PWB/Unix 中,当时 Thompson 和 Mashey shell 都不支持for
循环。我认为for
循环最适合您的情况。但是让程序尽可能使用管道是一种优雅的做法,因此以下是如何使用 xargs 来做到这一点:
printf "%s\n" abc def ghi jkl | xargs -I {} unzip applications/{}.zip -d applications/{}/
答案3
一种可能性是变量;您只需在上一个/单独的命令中分配它:
a=abc
unzip applications/"$a".zip -d applications/"$a"/
a=def
!unzip
答案4
是的,for
循环是完成您的任务的一个很好的解决方案。
for i in abc def ghi jkl; do
unzip applications/"$i".zip -d applications/"$i"/
done
或者在一行上使用相同的命令,以便从命令行而不是脚本使用:
for i in abc def ghi jkl; do unzip applications/"$i".zip -d applications/"$i"/; done
对于示例中的值来说,引号$i
不是必需的,但如果您不确定永远不会有带有空格或其他特殊字符的值,最好使用引号。