?

Log in

Интересное поведение bash (и задачка) - Оболочка Bash [entries|archive|friends|userinfo]
Оболочка Bash

[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Интересное поведение bash (и задачка) [Nov. 20th, 2006|07:57 pm]
Оболочка Bash

ru_bash

[po_moemu]
Вариант 1:
for i in "line one" "line two"; do echo $i; done

Вывод:
line one
line two

теперь вариант 2:
A='"line one" "line two"'
for i in $A; do echo $i; done

Вывод:
"www
rrr"
"eee
ttt"

Вопрос. Зачем он так себя ведёт, что его заставляет так поступать?

И задачка: как сделать чтобы он вёл себя также как в 1-м варианте.
linkReply

Comments:
(Deleted comment)
(Deleted comment)
[User Picture]From: po_moemu
2007-07-10 02:16 pm (UTC)
ваш вариант также работает неправильно.

правильный вариант помог мне найти Brock Noland (bashcurescancer.com):

bash-2.05$ cat test.sh
#!/bin/bash

echo 111111111
A=' "line one" "line two" '; for i in $A; do echo $i; done

echo 2222222222
for i in "line one" "line two"; do echo $i; done

echo 333333333
A='"line one"\n"line two"'; echo -e $A | while read i; do echo $i; done

echo 44444444
A='line one\nline two'; echo -e $A | while read i; do echo $i; done

bash-2.05$ ./test.sh
111111111
"line
one"
"line
two"
2222222222
line one
line two
333333333
"line one"
"line two"
44444444
line one
line two
(Reply) (Parent) (Thread)
[User Picture]From: sphynkx
2008-10-05 01:06 am (UTC)

Юзайте массивы - не пожалеете ;-))

A=("line one" "line two"); for i in "${A[@]}"; do echo "$i"; done
line one
line two

ЗЫ: фишка - в окавычении переменных в for'е
(Reply) (Thread)
[User Picture]From: po_moemu
2008-10-05 10:44 am (UTC)

Re: Юзайте массивы - не пожалеете ;-))

клёво, но практическое применение этого сниппета в том, чтобы обрабатывать имена файлов (ls), которые содержат пробелы в названии.
(Reply) (Parent) (Thread)
[User Picture]From: sphynkx
2008-10-05 03:09 pm (UTC)

Re: Юзайте массивы - не пожалеете ;-))

Все лечится!!

touch "imja fajla1" "imja fajla2" "imja fajla3" "dlinnoe imja fajla4"
IFS=;A=(`ls -1`); for i in "${A[@]}"; do echo $i; done


Результат:


dlinnoe imja fajla4
imja fajla1
imja fajla2
imja fajla3


ЗЫ: Пробелы в именах файлов - это зло!! Правда, в никсах - гораздо меньшее ;-))
(Reply) (Parent) (Thread)
[User Picture]From: po_moemu
2008-10-05 05:49 pm (UTC)

Re: Юзайте массивы - не пожалеете ;-))

ну это "грязный хак". в этом случае нет нужды и массивы использовать:
IFS=`echo`; A=`ls`; for i in $A; do echo $i; done

(есть и более элегантное решение ;)
(Reply) (Parent) (Thread)
[User Picture]From: sphynkx
2008-10-05 08:22 pm (UTC)

Re: Юзайте массивы - не пожалеете ;-))

Не спорю - просто переделал по быстрому же имевшуюся строчку ;-))
Но массивы - все равно красивая фишка!! =))
(Reply) (Parent) (Thread)
[User Picture]From: po_moemu
2008-10-06 06:36 am (UTC)

Re: Юзайте массивы - не пожалеете ;-))

не. есть ещё более элегантное решение ;)
(Reply) (Parent) (Thread)
From: nefkoee3
2013-02-16 10:46 pm (UTC)
locals online now Go Here dld.bz/chwZN
(Reply) (Thread)