Склеивание строк в bash

Есть скрипт, который в директории ищет подкаталоги и записывает их в строку через пробел. Проблема в том, что это только постановка задачи. В реале за пределами цикла я получаю пустую строку. Подскажите, где я ошибся? что я делаю не так?
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .bash.geshi_code {font-family:monospace;} .bash.geshi_code .imp {font-weight: bold; color: red;} .bash.geshi_code .kw1 {color: #000000; font-weight: bold;} .bash.geshi_code .kw2 {color: #c20cb9; font-weight: bold;} .bash.geshi_code .kw3 {color: #7a0874; font-weight: bold;} .bash.geshi_code .co0 {color: #666666; font-style: italic;} .bash.geshi_code .co1 {color: #800000;} .bash.geshi_code .co2 {color: #cc0000; font-style: italic;} .bash.geshi_code .co3 {color: #000000; font-weight: bold;} .bash.geshi_code .es1 {color: #000099; font-weight: bold;} .bash.geshi_code .es2 {color: #007800;} .bash.geshi_code .es3 {color: #007800;} .bash.geshi_code .es4 {color: #007800;} .bash.geshi_code .es5 {color: #780078;} .bash.geshi_code .es_h {color: #000099; font-weight: bold;} .bash.geshi_code .br0 {color: #7a0874; font-weight: bold;} .bash.geshi_code .sy0 {color: #000000; font-weight: bold;} .bash.geshi_code .st0 {color: #ff0000;} .bash.geshi_code .st_h {color: #ff0000;} .bash.geshi_code .nu0 {color: #000000;} .bash.geshi_code .re0 {color: #007800;} .bash.geshi_code .re1 {color: #007800;} .bash.geshi_code .re2 {color: #007800;} .bash.geshi_code .re4 {color: #007800;} .bash.geshi_code .re5 {color: #660033;} .bash.geshi_code span.xtra { display:block; }
#!/bin/bash
clear
HOSTS_DIR="/путь/к/папке"
HOSTS_TO_ENABLE=""
find "$HOSTS_DIR" -maxdepth 1 -type d |
while read hostname;
do
        if [ $hostname != $HOSTS_DIR ]
        then
                CURRENT=`basename "$hostname"`
                HOSTS_TO_ENABLE="${HOSTS_TO_ENABLE} ${CURRENT}"
        fi
done
echo ${HOSTS_TO_ENABLE}

1 ответов


Тут дело в том, что цикл работает в отдельном потоке, а значит переменная HOSTS_TO_ENABLE внутри while никак не связана с той, что объявлена до цикла.

Выводите CURRENT в файл, а потом уже, после цикла, читайте в переменную.


Если вам не принципиально, вместо скрипта можно обойтись однострочкой (возможно есть идеи получше):

ls -l | grep ^d | awk '{s = s " " $9} END {print s}'
ls -l - выводит список директорий и файлов в расширенном формате,
grep ^d - отбирает только директории,
awk '{s = s " " $9} END {print s}' - выводит список директорий, собирая их в одну строку через пробел.

а разве после условия if не должно быть ;?

if [ $hostname != $HOSTS_DIR ]; then
Если не поможет - расставьте трассу:
echo 1;
...
echo 2;
...
и т.п.