2015-03-31 82 views
0

我使用的情況下循環,讓我再按下1接受$fn3值,按2$fn4接受該值或按3輸入我自己值。

這些被用在查找語句中。如果我按3並輸入文件名的一部分,$search1可正確輸入我輸入的數據,並且一切正常。如果我按任何12變量$search呼應要麼$fn3$fn4的正確值,但是當我分配search1*$search*echo search1現持有我當前文件夾中的文件列表,而不是$fn3$fn4山谷。

$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

不確定你要做什麼,但如果你引用:'search1 ='* $ search *''你的問題就會消失。 '*'正在被shell擴展到工作目錄中的所有文件。 – arco444 2015-03-31 11:37:02

+0

根據你如何使用'case'選擇答案,你可能想看看'select'語句:'select name [in word];做清單;做完了' – 2015-03-31 14:52:07

回答

1

您的變量實際上是被正確設置,發生問題,因爲當您使用它,你沒有把它周圍的雙引號。具體來說,當shell解析命令echo $search1時,它會替換值$search1(其中包含通配符),然後執行分詞(此處不重要)和通配符擴展(提供當前目錄中匹配文件的列表),手echo命令的結果,並打印匹配文件的列表(而不是變量的實際值)。

由於未加引號的變量,在其他上下文中會出現同樣的問題(以及其他問題!)。例如,如果您在find命令中使用search1而未正確引用它(find /path/to/dir -name $search1),則會在將值傳遞給find之前擴展通配符,然後find將根據您的需要執行其他操作。

有幾個背景,其中它的確定要離開變量引用不帶引號的,就像在賦值的右手邊(search1=*$search*實際上是確定),但它更容易只是總是雙引號(如search1="*$search*")而不是跟蹤何時可以放棄報價。

說到這,如果ans包含空格和/或通配符,case $ans in將導致問題。也是雙引號。

0

我所要做的就是搜索重複的音樂文件,這些文件的名稱已經存在於我的硬盤和單獨的文件夾中。 音樂名稱可能是 01。勁舞-什麼feeling.mp3 或 什麼感覺(混音)#flashdance.mp3 在聲明中 $ fn3的分配此案說什麼感覺 $ FN4分配說勁舞 讀是從我鍵入值 echo $ search #display在屏幕上 然後下面的find命令在變量「search」中搜索特定文件夾中的數據。 work_dir是搜索必須發生並將改變的文件夾。

(找到 「$ {WORK_DIR}」 -iname $搜索型的F -maxdepth 10個-exec LS -lh {} \; 2>的/ dev/null的| AWK「{打印$ 5,$ 9 $ 10, $ 11 $ 12 $ 13 $ 14 $ 15 $ 16 $ 17 $ 18 $ 19 $ 20 $ 21 $ 22 $ 23 $ 24 我已經嘗試了上述建議,但它仍然顯示我當前的文件夾,而不僅僅是搜索變量。上述命令工作正常,我使用讀取命令,但是當搜索被賦值爲$ fn3或$ fn4變量時,它不起作用。是否有更好的方法來做到這一點。

+0

看起來你需要在'* $ search *'周圍使用雙引號 - 沒有它們,shell在將參數列表傳遞給'find'之前執行通配符擴展,所以它看到的是當前匹配的列表目錄。 – 2015-03-31 19:04:50

+0

我已經完成了「* $ search *」,但仍然沒有快樂 – 2015-03-31 20:20:42