我是 shell 脚本的新手。 任何人都可以用一种非常简单的语言向我解释下面几行,或者给我一些链接,我可以在其中找到我正在搜索的确切含义,如下面的代码所示:
文件如何获取值?它是从完成后编写的 grep 命令获取的吗?
dir=$1 str=$2
while IFS= read -rd '' file; #What '' is doing?
do
base=${file##*/} #Please explain
dir=${file%/*} #Please explain
done < <(exec grep -ZFlR "$str" "$dir")
提前致谢 :)
最佳答案
第一行用于读取由 grep -ZFlR "$str""$dir"
传递的原始输入。
while IFS= read -rd '' file;
因为您在grep
中指定了-Z
,所以它会输出一个零字节,而不是通常grep 会用换行符分隔的文件名。因此在读取命令中也指定了一个 -d
选项来引用定界符。
至于 IFS=
,这样做是为了清空 IFS(内部字段分隔符)以保留前导和尾随空格。更多阅读 here
下一行:
base=${file##*/}
从 $file
的前面删除以斜杠结尾的任何字符的最长匹配。所以像这样:
/abc/def/jhg
-------->
strips off /abc/def/
同理第三行:
dir=${file%/*}
从 $file 的末尾删除最短的匹配。
/abc/def/jhg
<----
strips off /jhg.
更多阅读here .
由于您没有询问最后一行,我假设您熟悉它被重定向到 while 循环。
关于linux - 理解 shell 脚本——IFS, '',##,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25197146/