1

我正在尝试制作 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 循环中见过冒号和散列。我还没有找到关于它们的任何文档......有人可以尝试启发我吗?我会很感激的。

4

2 回答 2

2

这里不涉及数组。POSIX sh 没有数组(假设您没有使用基于标签的另一个 shell)。

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

为了解释其余部分:首先find运行并有趣地通过管道传输到两个 grep 中,这两个 grep 可以单独使用 find 完成(除了中断可能包含换行符的文件名),并将输出保存到files. 如果仅限于 POSIX 工具,这也是无法真正正确完成的事情,但有更好的方法。

接下来,shell 以更荒谬的方式files扩展了未引用和变异,以便循环遍历无意义的结果。如果脚本的其余部分如此糟糕,则可能将其丢弃并重新开始。没有办法做到预期的事情。 for

于 2012-07-12T17:49:17.760 回答
1

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

A=abcdefg
echo ${A:4}

将打印输出:

efg

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

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

于 2012-07-12T17:40:52.453 回答