2012-07-12 34 views
1

我正在尝试制作一个shell脚本的正面或反面。有人可以解释这一行吗?For shell脚本中的循环 - 冒号和散列标记?

$ FILEDIR是一个包含文件的目录。 F是从此命令返回的文件数组中的标记: files = $(find $ FILEDIR -type f | grep -v .rpmsave \ $ | grep -v .swp \ $)

令人困惑行在for循环内。

for f in $files; do 
target=${f:${#FILEDIR}} 
<<do some more stuff>> 
done 

我从来没有见过冒号和散列在shell脚本for循环之前。我一直无法找到任何文件......有人可以尝试启发我吗?我会很感激。

+0

bash中的$ {f:$ {#FILEDIR}}给出的结果与更便携的表达式'$ {f#$ FILEDIR}'相同。这两个表达式都从'$ f'中删除'$ FILEDIR'前缀。第二个表达式是首选。 – 2012-07-16 21:32:29

回答

2

这里没有涉及到数组。 POSIX sh没有数组(假设你没有使用基于标签的其他shell)。

冒号表示Bash/Ksh substring expansion。这些也不是POSIX。前缀#展开为参数中的字符数。我想他们打算砍掉目录部分并将其分配给target

要解释的休息:第一find运行和欢快的管道分成两里grep该做些什么本来可以单独找到(除了打破包含换行符可能的文件名)来完成,而输出保存到files。如果仅限于POSIX工具,这也是不能真正做到的,但有更好的方法。

接着,files进行更ridiculousways膨胀unquoted和mutalated由外壳为for环路在没有意义的结果迭代。如果脚本的其余部分很糟糕,可能会抛出并重新开始。没有办法达到预期的效果。

+0

太好了,谢谢你的链接。我找到了我正在解析的rpm文件,并试图理解这一行,因为它会影响单点登录软件包的安装方式。我们的安全团队希望我们部署它,但无法提供它所做的更改列表,因此我们无法确定它会破坏什么。非常感谢 - 我想我会运行差异并制作补丁文件:) – Matthew 2012-07-12 20:00:22