我正在使用案例循环,允许我按1
接受$fn3
中的值,按2
接受$fn4
中的值或按3
输入我自己的价值。
这些用于find语句。如果我按3
并输入文件名的一部分,$search1
会回显我正确键入的数据,一切正常。如果我按下1
或2
,则变量$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
答案 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变量分配搜索时,它不起作用。有更好的方法这样做。