我有一个登录到远程主机的脚本,可以将目录列表拉到以后向用户显示选项。这一切都很完美,直到一些目录开始有空格。我已经尝试了几种语法并用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'`)
如何正确分离这些目录?
答案 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
如果目录名称包含空格,则此方法有效。