bash 中的反向引用

bash 中的反向引用

我正在尝试设计一个“优雅”的解决方案来执行以下操作:

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不是必需的,但如果您不确定永远不会有带有空格或其他特殊字符的值,最好使用引号。

相关内容