Проблема: создаю папку, имя которой содержит пробел ( mkdir aaa\ bbb ). Непосредственно перейти в папку не проблема ( cd aaa\ bbb -работает ), но VAR="aaa\ bbb", cd $VAR - не работает, говорит что каталог aaa\ не найден! Причем ни "$VAR", ни ${VAR}, ни "${VAR}" не помогает....
>Проблема: создаю папку, имя которой содержит пробел ( 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.
>>Проблема: создаю папку, имя которой содержит пробел ( 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 может содержать имена и без пробелов. Заранее большое спасибо!
>Признаю свои ошибки. Но на самом деле проблема не в этом.
>Пусть
>LIST='aaa\ bbb ccc\ ddd', где aaa bbb и ccc ddd - имена
>папок, каждая из которых содержит пробел в своем имени.
>Теперь:
>for i in $LIST
> do
> cd "$i"
> ......
> ......
> ......
> cd ..
> done
>
>Как в этом случае обмануть пробел ??? Причем LIST может содержать имена
>и без пробелов. Заранее большое спасибо!
Чтение документации решит все Ваши вопросы...
>>Признаю свои ошибки. Но на самом деле проблема не в этом.
>>Пусть
>>LIST='aaa\ bbb ccc\ ddd', где aaa bbb и ccc ddd - имена
>>папок, каждая из которых содержит пробел в своем имени.
>>Теперь:
>>for i in $LIST
>> do
>> cd "$i"
>> ......
>> ......
>> ......
>> cd ..
>> done
>>
>>Как в этом случае обмануть пробел ??? Причем LIST может содержать имена
>>и без пробелов. Заранее большое спасибо!
>
>
>Чтение документации решит все Ваши вопросы...Исчерпывающий ответ...
Один из вариантов - воспользоваться массивом и примерно таким алгоритмом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
А вообще, возможно, решение еще проще, если знать, откуда берется список.
>Один из вариантов - воспользоваться массивом и примерно таким алгоритмом
>
>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 вариант нессомненно превосходнее.