为变量分配* $ search *会显示错误的结果

时间:2015-03-31 11:27:23

标签: bash

我正在使用案例循环,允许我按1接受$fn3中的值,按2接受$fn4中的值或按3输入我自己的价值。

这些用于find语句。如果我按3并输入文件名的一部分,$search1会回显我正确键入的数据,一切正常。如果我按下12,则变量$search会回显$fn3$fn4的正确值,但当我将search1分配给*$search*时{1}},echo search1现在包含当前文件夹中的文件列表,而不是$fn3$fn4的值。

稍后在脚本中的find命令中使用$search1变量。是什么导致文件出现在变量中?

case $ans in
    1)     search=$fn3;;
    2)     search=$fn4;;
    3)     read search;;
    q*|Q*) quit 0;;
    *)     echo "please enter a number between 1 and 3";;
esac

echo $search    #use to see what variable search holds 

# $search hold part of the file name im going to search for,i  add * for searching for anything which has the search vale in its name.

search1=*$search* 

echo $search1    #use to see what variable search1 

2 个答案:

答案 0 :(得分:1)

您的变量实际上已正确设置,问题正在发生,因为您在使用它时,并未在其周围加上双引号。具体来说,当shell解析命令echo $search1时,它会替换$search1(包括通配符)的值,然后执行分词(这里不重要)和通配符扩展(给出匹配列表)当前目录中的文件),将结果传递给echo命令,并打印匹配文件列表(而不是变量的实际值)。

由于不带引号的变量,在其他环境中也会出现同样的问题(以及其他问题!)。例如,如果您在find命令中使用search1而未正确引用它(find /path/to/dir -name $search1),则会在将值传递给find之前扩展通配符,然后{{ 1}}将根据你的想法做一些事情。

有一些情况可以让变量引用不加引号,例如在赋值的右侧(find实际上可以正常),但它更容易只需始终双引号(例如search1=*$search*),而不是跟踪何时可以放弃引号。

如果ans包含空格和/或通配符,search1="*$search*"会导致问题。双引号也是如此。

答案 1 :(得分:0)

我要做的就是搜索重复的音乐文件,这些文件的名称略有不同,这些文件已经在我的硬盘上和单独的文件夹中。 音乐名称可以是 01。闪光 - 什么是感觉.mp3 要么 感觉如何(混音)#flashdance.mp3 声明中的案例 $ fn3分配说出什么感觉 $ fn4分配说Flashdance read来自我输入的值 echo $ search #display在屏幕上显示 然后以下find命令在特定文件夹中搜索变量“search”中的数据 work_dir是搜索必须发生并将更改的文件夹。

(找到“$ {work_dir}” - iname $ search -type f -maxdepth 10 -exec ls -lh {} \; 2> / dev / null | awk'{print $ 5, $ 9,$ 10,$ 11,$ 12,$ 13,$ 14,$ 15,$ 16,$ 17,$ 18,$ 19,$ 20,$ 21,$ 22,$ 23,$ 24“\ n \ n”}') 。 我已经尝试了上述建议,但它仍然显示我当前的文件夹,而不仅仅是搜索变量。上面的命令工作正常,我使用读取命令但是当从$ fn3或$ fn4变量分配搜索时,它不起作用。有更好的方法这样做。