Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何停止';*的Bash扩展。";在函数中?_Bash - Fatal编程技术网

如何停止';*的Bash扩展。";在函数中?

如何停止';*的Bash扩展。";在函数中?,bash,Bash,在尝试运行以下函数时,Bash以一种意外的方式扩展了我的变量,从而阻止了我获得预期的结果 这归结为bash处理我传递给函数的“*.h”的方式 以下是我调用的函数: link_files_of_type_from_directory "*.h" ./.. 我希望这个变量在某个时刻一直保持这种状态,当它点击echo$command\u to\u run时我的Bash脚本的一部分…此变量已扩展为 MyHeader1.h MyHeader2.h MyHeader3.h 等等 我希望Bash不要扩展我

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

这归结为bash处理我传递给函数的
“*.h”
的方式

以下是我调用的函数:

link_files_of_type_from_directory "*.h" ./..
我希望这个变量在某个时刻一直保持这种状态,当它点击
echo$command\u to\u 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
命令实际运行。以下是我在尝试正确组装
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':

希望得到这方面的帮助,尽管这是一个不同的问题:)

通过引用变量、删除分号并将循环包装到
-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 {} +
}

双重引用变量引用。善于发现这样的问题。谢谢!我现在有了正确的字符串,但我似乎无法对其进行求值,从而得到我想要的结果:/#因为我的$mmd;#在命令#for i IN'$(mdd)#中循环字符串在${!MMD}中按字面意思为i运行MMD;#错误:变量名无效-查找-键入f-name'*.h':@ovatsug25,注释的格式很糟糕。我建议您在底部顶部添加一个“更新”部分,并进行说明。
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 {} +
}