【问题标题】:Is the IFS Variable Changed in the following?IFS 变量是否发生了以下变化?
【发布时间】:2015-05-01 06:05:27
【问题描述】:

sn-p 下面是我用来确定文件在文件系统中的路径和文件名的内容。

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 变量已更改而失败。

【问题讨论】:

    标签: linux bash shell ifs


    【解决方案1】:

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

    引用Simple Commands in the spec 中的相关部分(强调我的):

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

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

    【讨论】:

    • 如果在此期间执行的其他脚本(变量的值发生更改)使用 IFS 变量怎么办?
    • 他们不会受到影响。
    猜你喜欢
    • 1970-01-01
    • 2012-12-18
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2021-04-08
    相关资源
    最近更新 更多