使用包含命令空格的元素生成bash脚本数组

时间:2015-02-24 01:18:49

标签: bash

我有一个登录到远程主机的脚本,可以将目录列表拉到以后向用户显示选项。这一切都很完美,直到一些目录开始有空格。我已经尝试了几种语法并用Google搜索了这一切,我现在处于系绳的最后。原来的命令是:

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

我首先更改了此代码,以便能够读取这样的空格:

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

然而,这导致每个单词被识别为变量。我尝试了很多方法来解决这个问题,其中两个是:

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

如何正确分离这些目录?

2 个答案:

答案 0 :(得分:1)

如果您尝试每行读取一个数组值而不是以空格分隔,那么$()语法将无济于事。试试readarray(Bash 4):

readarray SERVERDIRS < <(sshpass -p $PASS ssh -oStrictHostKeyChecking=no $USER@$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 $USER@$SERVER ls -l --time-style="long-iso" $FROMFOLDER | egrep '^d' | cut -d' ' -f8-)

或者,实际上,对this SO question的任何其他答案。

如果您不熟悉<()语法,则称为process substitution,并且允许在当前环境中设置变量,而不是管道将立即丢弃的子shell。< / p>

请记住,这个过程有点危险;文件名也可以包含换行符,因此它通常比use find ... -print0更受欢迎。

答案 1 :(得分:-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

如果目录名称包含空格,则此方法有效。

相关问题