URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5809
[ Назад ]

Исходное сообщение
"Shell"

Отправлено demix , 12-Окт-06 14:20 
Проблема: создаю папку, имя которой содержит пробел ( mkdir aaa\ bbb ). Непосредственно  перейти в папку не проблема ( cd aaa\ bbb -работает ), но VAR="aaa\ bbb", cd $VAR - не работает, говорит что каталог aaa\ не найден! Причем ни "$VAR",  ни ${VAR}, ни "${VAR}" не помогает....

Содержание

Сообщения в этом обсуждении
"Shell"
Отправлено newser , 12-Окт-06 16:34 
>Проблема: создаю папку, имя которой содержит пробел ( mkdir aaa\ bbb ).
>Непосредственно  перейти в папку не проблема ( cd aaa\ bbb
>-работает ), но VAR="aaa\ bbb", cd $VAR - не работает, говорит
>что каталог aaa\ не найден! Причем ни "$VAR",  ни ${VAR},
>ни "${VAR}" не помогает....

А смысл кавычек Вам известен? И смысл экранирующей косой черты? Об этом написано в мане по shell. Вкратце: если в имени файла/каталога есть пробел (как в Вашем случае), то экранировать этот пробел можно либо при помощи обратной косой черты, либо при помощи кавычек, причем как правило как одиночных, так и двойных (в чем различие использования одних от других оставляю для самостоятельного изучения).

Т.е. создать каталог можно одним из способов:

mkdir aaa\ bbb
mkdir "aaa bbb"
mkdir 'aaa bbb'

Теперь переменная. Ее можно задать аналогично:

VAR=aaa\ bbb
VAR="aaa bbb"
VAR='aaa bbb'

Использование же переменной лучше (в данном случае) осуществлять с помощью двойных кавычек, т.е.

cd "$VAR"
или
cd "${VAR}"

Почему так - описано в документации по shell.


"Shell"
Отправлено demix , 16-Окт-06 08:48 
>>Проблема: создаю папку, имя которой содержит пробел ( mkdir aaa\ bbb ).
>>Непосредственно  перейти в папку не проблема ( cd aaa\ bbb
>>-работает ), но VAR="aaa\ bbb", cd $VAR - не работает, говорит
>>что каталог aaa\ не найден! Причем ни "$VAR",  ни ${VAR},
>>ни "${VAR}" не помогает....
>
>А смысл кавычек Вам известен? И смысл экранирующей косой черты? Об этом
>написано в мане по shell. Вкратце: если в имени файла/каталога есть
>пробел (как в Вашем случае), то экранировать этот пробел можно либо
>при помощи обратной косой черты, либо при помощи кавычек, причем как
>правило как одиночных, так и двойных (в чем различие использования одних
>от других оставляю для самостоятельного изучения).
>
>Т.е. создать каталог можно одним из способов:
>
>mkdir aaa\ bbb
>mkdir "aaa bbb"
>mkdir 'aaa bbb'
>
>Теперь переменная. Ее можно задать аналогично:
>
>VAR=aaa\ bbb
>VAR="aaa bbb"
>VAR='aaa bbb'
>
>Использование же переменной лучше (в данном случае) осуществлять с помощью двойных кавычек,
>т.е.
>
>cd "$VAR"
>или
>cd "${VAR}"
>
>Почему так - описано в документации по shell.


Признаю свои ошибки. Но на самом деле проблема не в этом.
Пусть
LIST='aaa\ bbb ccc\ ddd', где aaa bbb и ccc ddd - имена папок, каждая из которых содержит пробел в своем имени.
Теперь:
for i in $LIST
   do
       cd "$i"
       ......
       ......
       ......
       cd ..
   done

Как в этом случае обмануть пробел ??? Причем LIST может содержать имена и без пробелов. Заранее большое спасибо!


"Shell"
Отправлено newser , 16-Окт-06 09:17 
>Признаю свои ошибки. Но на самом деле проблема не в этом.
>Пусть
>LIST='aaa\ bbb ccc\ ddd', где aaa bbb и ccc ddd - имена
>папок, каждая из которых содержит пробел в своем имени.
>Теперь:
>for i in $LIST
>   do
>       cd "$i"
>       ......
>       ......
>       ......
>       cd ..
>   done
>
>Как в этом случае обмануть пробел ??? Причем LIST может содержать имена
>и без пробелов. Заранее большое спасибо!


Чтение документации решит все Ваши вопросы...


"Shell"
Отправлено demix , 16-Окт-06 10:00 
>>Признаю свои ошибки. Но на самом деле проблема не в этом.
>>Пусть
>>LIST='aaa\ bbb ccc\ ddd', где aaa bbb и ccc ddd - имена
>>папок, каждая из которых содержит пробел в своем имени.
>>Теперь:
>>for i in $LIST
>>   do
>>       cd "$i"
>>       ......
>>       ......
>>       ......
>>       cd ..
>>   done
>>
>>Как в этом случае обмануть пробел ??? Причем LIST может содержать имена
>>и без пробелов. Заранее большое спасибо!
>
>
>Чтение документации решит все Ваши вопросы...

Исчерпывающий ответ...


"Shell"
Отправлено madskull , 16-Окт-06 15:38 
Один из вариантов - воспользоваться массивом и примерно таким алгоритмом

LIST=("a b" "c d")
for ((i=0; $i<${#LIST[@]}; i++)); do
    echo "<${LIST[$i]}>"
done

Другой - заменить разделитель полей

LIST="a b,c d"
IFS=','
for i in $LIST; do
    echo "<$i>"
done


А вообще, возможно, решение еще проще, если знать, откуда берется список.


"Shell"
Отправлено demix , 17-Окт-06 08:39 
>Один из вариантов - воспользоваться массивом и примерно таким алгоритмом
>
>LIST=("a b" "c d")
>for ((i=0; $i<${#LIST[@]}; i++)); do
>    echo "<${LIST[$i]}>"
>done
>
>Другой - заменить разделитель полей
>
>LIST="a b,c d"
>IFS=','
>for i in $LIST; do
>    echo "<$i>"
>done
>
>
>А вообще, возможно, решение еще проще, если знать, откуда берется список.


Огромное спасибо! С IFS вариант нессомненно превосходнее.