2015-02-24 54 views
0

我有一個腳本,它登錄到遠程主機以拉取目錄列表,以便稍後向用戶顯示選項。這一切都很完美,直到其中一些目錄開始有空間。我已經嘗試了幾種語法,並且使用了這個命令,我現在處於我的繫繩的末尾。原來的命令是這樣的:使用包含命令空格的元素生成bash腳本數組

SERVERDIRS=($(sshpass -p $PASS ssh -oStrictHostKeyChecking=no [email protected]$SERVER ls -l --time-style="long-iso" $FROMFOLDER | egrep '^d' | awk '{print $8}')) 

我首先改變了這種代碼能夠讀取的空間是這樣的:

SERVERDIRS=($(sshpass -p $PASS ssh -oStrictHostKeyChecking=no [email protected]$SERVER ls -l --time-style="long-iso" $FROMFOLDER | egrep '^d' | cut -d' ' -f8-)) 

但是這導致每個字被識別爲一個變量。我嘗試了很多方法來嘗試解決這個問題,其中兩個是:

SERVERDIRS=($(sshpass -p $PASS ssh -oStrictHostKeyChecking=no [email protected]$SERVER ls -d $FROMFOLDER* |rev| cut -d'/' -f1|rev|sed s/^/\"/g|sed s/$/\"/g)) 
SERVERDIRS=($(sshpass -p $PASS ssh -oStrictHostKeyChecking=no [email protected]$SERVER ls -d $FROMFOLDER* |rev| cut -d'/' -f1|rev|sed 's/ /\\ /g')) 
SERVERDIRS=(`sshpass -p $PASS ssh -oStrictHostKeyChecking=no [email protected]$SERVER ls -d $FROMFOLDER* |rev| cut -d'/' -f1|rev|sed 's/ /\\ /g'`) 

如何解決這些目錄以正確分隔元素?

+1

我不確定它是否可以正常工作,但是您可以嘗試將$ IFS更改爲空間以外的內容,以便空格不會導致腳本將空格分隔的字符串解析爲單獨的attibutes? [這可能有助於](http://stackoverflow.com/questions/4128235/bash-shell-scripting-what-is-the-exact-meaning-of-ifs-n) – andrew 2015-02-24 01:55:30

+0

我會從最明顯的事情開始,雙引號您的變量,以防止空白問題。 「$ FROMFOLDER」應該做我猜的詭計。 – tvm 2015-02-24 01:55:33

回答

1

如果您想要每行讀取一個數組值而不是以空格分隔,則$()語法將無濟於事。嘗試readarray(擊4):

readarray SERVERDIRS < <(sshpass -p $PASS ssh -oStrictHostKeyChecking=no [email protected]$SERVER ls -l --time-style="long-iso" $FROMFOLDER | egrep '^d' | cut -d' ' -f8-) 

assign IFS and read with -d, -r, and -a set

IFS=$'\n' read -d '' -r -a SERVERDIRS < <(sshpass -p $PASS ssh -oStrictHostKeyChecking=no [email protected]$SERVER ls -l --time-style="long-iso" $FROMFOLDER | egrep '^d' | cut -d' ' -f8-) 

,或者說真的,任何其他答案this SO question

如果您不熟悉<()語法,則它被稱爲process substitution,並允許在當前環境中設置您的變量,而不是管道將創建的即時丟棄的子shell。

請記住,這個過程是有點危險;文件名也可以包含換行符,所以它通常比use find ... -print0更受歡迎。

+0

readarray選項不起作用,但我最終通過將IFS重新分配給新行來工作(當然,之後恢復正常)。看起來有點冒失,但完成了工作。謝謝! – fileinster 2015-02-25 00:33:34

-1

如果你只需要列出目錄,試試這個

ls -d /usr/local/src/*/ 

ls -d /path/to/your/directory/*/ 

然後,您可以通過所有目錄

#!/bin/bash 

aa=`ls -d /usr/local/src/*/` 

for dir in "${aa}[@]" 
do 
    echo "$dir" 
done 

這個工作,如果目錄名稱包含空格環。