linux - 理解 shell 脚本——IFS, '',##

标签 linux shell

我是 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/

相关文章:

linux - Unix shell 描述符重定向

linux - 从两个文件中读取、匹配、替换模式并使用结果创建输出文件

android - ARC Welder 应用程序在启动时显示空白页面

bash - 在 Bash 中执行包含空格的命令

Android Tasker App Advance Input Shell 命令

linux - 在命令行中同时执行两个命令

c - 尝试读取隐藏文件 linux 时出现段错误

linux - 如何在 Linux 上使用 mail 命令附加文件?

bash - 设置只读变量时未调用 ERR 陷阱

linux - 绑定(bind)具有相同 key 代码的 key ,不会丢失第二个 key