如何停止';*的Bash扩展。";在函数中?
在尝试运行以下函数时,Bash以一种意外的方式扩展了我的变量,从而阻止了我获得预期的结果 这归结为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不要扩展我
“*.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 {} +
}