对于shell脚本中的循环 - 冒号和散列标记?

时间:2012-07-12 17:21:28

标签: shell loops sh

我正在努力制作shell脚本的正面或反面。有人可以解释一下这条线吗?

$ FILEDIR是一个包含文件的目录。 F是从此命令返回的文件数组中的标记: files = $(找$ 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循环中看过冒号和哈希。我一直无法找到关于它们的任何文件......有人可以试着开导我吗?我很感激。

2 个答案:

答案 0 :(得分:2)

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

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

要解释其余部分:第一个find运行并且热闹地传输到两个greps中,这些greps执行可以单独使用find执行的操作(除了打破包含换行符的可能文件名),并且输出保存到{ {1}}。如果仅限于POSIX工具,这也是无法正确完成的事情,但有更好的方法。

接下来,files展开unquoted,并在files ridiculousfor循环中通过shell进行变异,以迭代无意义的结果。如果脚本的其余部分很糟糕,可能会将其丢弃并重新开始。没有办法实现预期的目标。

答案 1 :(得分:1)

冒号可以作为子串。所以:

A=abcdefg
echo ${A:4}

将打印输出:

efg

我不确定他们为什么会使用文件目录作为第二个参数...

如果您在理解for循环部分时遇到问题,请尝试http://www.dreamsyssoft.com/unix-shell-scripting/loop-tutorial.php