首页 > 解决方案 > 如何在函数中停止“* .h”的 Bash 扩展?

问题描述

在尝试运行以下函数时——Bash 以一种意想不到的方式扩展了我的变量——从而阻止了我得到预期的结果。

它归结为 bash 处理"*.h"我传递给函数的 a 的方式。

这是我调用的函数:

link_files_of_type_from_directory "*.h" ./..

我希望这个变量在某个时候一直保持这种状态,当它到达echo $command_to_run;我的 Bash 脚本的一部分时......这个变量已经扩展到......

MyHeader1.h MyHeader2.h MyHeader3.h

等等。

我想要的是让 Bash 不扩展我的文件,以便我的代码运行以下内容:

find ./.. -type f -name '*.h'

代替

find ./.. -type f -name  MyHeader1.h MyHeader2.h MyHeader3.h 

这是代码:

function link_files_of_type_from_directory {
    local file_type=$1;
    local directory_to_link=$2;

    echo "File type $file_type";
    echo "Directory to link $directory_to_link";

    command="find $directory_to_link -type f -name $file_type";
    echo $command;

    #for i in $(find $directory_to_link -type f -name $file_type);
    for i in $command;
        do 
            echo $i;
            if test -e $(basename $i); then
            echo $i exists;
            else
            echo Linking: $i;
            ln -s $i;
            fi
    done;
}

如何防止扩展,以便 Bash 搜索以*.h我要传入的目录结尾的文件?

更新 1:

所以我已经将调用更新为

link_files_of_type_from_directory "'*.h'" ..

该函数现在组装要评估的命令的字符串,如下所示:

mmd="find $directory_to_link -type f -name $file_type";

当我回应它时,它是正确的:)

find .. -type f -name '*.h'

但我似乎无法让find命令实际运行。以下是我在尝试正确组装for循环时遇到的错误/错误:

# for i in $mmd;        # LOOPS THROUGH STRINGS IN COMMAND
# for i in '$(mdd)';  # RUNS MMD LITERALLY
# for i in ${!mmd};   # Errors out with: INVALID VARIABLE NAME — find .. -type f -name '*.h':

希望在这方面有所帮助 - 即使这是一个不同的问题:)

标签: bash

解决方案


通过引用变量、删除分号并将循环包装到一个-exec动作中以防止文件名中的空格、制表符和换行符出现问题,您的函数如下所示:

function link_files_of_type_from_directory {
    local file_type=$1
    local directory_to_link=$2

    echo "File type $file_type"
    echo "Directory to link $directory_to_link"

    find "$directory_to_link" -type f -name "$file_type" -exec sh -c '
      for i do
        echo "$i"
        if test -e "$(basename "$i")"; then
          echo "$i exists"
        else
          echo "Linking: $i"
          ln -s "$i"
        fi
      done
    ' sh {} +
}

推荐阅读