2

下面的代码片段是我用来确定文件系统中文件所在位置的路径和文件名的内容。

for index in "${!files[@]}"

    do
    (find . -type f -name "${files[index]}" -print0) 2>&1 | while IFS= read -r -d $'\0' line; do
        if [[ ${line} == ${search_pattern}* ]]
        then
             relative_path=$(echo "$line"|awk '{print substr($0,2)}')
             file_path=$(echo "$(pwd)$relative_path" |awk -F/ '{$NF=""; print $0}'|sed -e 's/ /\//g')
             file_name=$(echo "$(pwd)$relative_path" |awk -F/ '{print $NF}')
    .................................................................

我的问题是关于线路,

"while IFS= read -r -d $'\0' line; do"

早些时候,我在 find 命令上使用了 for 循环。但是在stackoverflow上有一篇文章说这更好,更正确。我试过了,它有效,但不太明白。此行是否会以任何会改变主外壳的方式更改 IFS?我试图弄清楚,因为我不太精通 SHELL 脚本,我无法理解该行的作用。

我不想在生产系统中部署它,然后发现其他脚本失败,因为 IFS 变量已更改。

4

1 回答 1

2

当您IFS对命令执行内联赋值时read,变量的值在命令执行期间会更改,但在命令完成后不会保持更改。

引用规范中简单命令的相关部分(强调我的):

如果没有产生命令名,变量赋值将影响当前的执行环境。否则,为命令的执行环境导出变量赋值,并且不影响当前执行环境(特殊内置除外)。如果任何变量赋值尝试为只读变量赋值,则会发生变量赋值错误。有关这些错误的后果,请参阅 Shell 错误的后果。

在Unix & Linux Stack Exchange上有很多与这个问题相关的答案。

于 2015-05-01T06:22:37.600 回答