2015-02-24 65 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 

这个工作,如果目录名称包含空格环。