LINUX.ORG.RU

Foreach в командной строке

 


1

3

Какой способ последовательного вызова одной и той же команды для каждой строки из текста наилучший? Про циклы for в баше мне известно, но может есть более короткое для записи решение?

★★★★★

Какой способ последовательного вызова одной и той же команды для каждой строки из текста наилучший?

А их что, много?

while read -r; do
    printf '%s\n' "$REPLY"
done < file

Про циклы for в баше мне известно

Очень интересно. И что же вам про него известно? Как вы собираетесь его сюда применить?

Zmicier ★★★★★
()
Последнее исправление: Zmicier (всего исправлений: 1)
Ответ на: комментарий от Zmicier

Тогда уж надо сказать, что в баше нет ls, cat, less, sed, grep, awk и т.д., и т.п.

Кто на чистом баше скрипты пишет? Они же вообще ничего полезного сделать не смогут!

anonymous
()
Ответ на: комментарий от anonymous

Кто на чистом баше скрипты пишет?

Наверное тот кто его знает?

Они же вообще ничего полезного сделать не смогут!

Пример хотя бы кинь чего ты на баше не осилил с «ls, cat, less, sed, grep, awk»

ashot ★★★★
()
Ответ на: комментарий от anonymous

Тогда уж надо сказать, что в баше нет ls, cat, less, sed, grep, awk и т.д., и т.п.

Выхлоп ls непригоден для машинного разбора и в скриптах ему всё равно делать нечего, чисто к сведению.

d_a ★★★★★
()
Ответ на: комментарий от ashot

Ну да, только это slurp (как это будет по-русски? «захавать»? :-D).

То есть это уже не будет традиционный поточный фильтр. Но да, вы правы, в условии действительно не сказано, что должен быть именно он.

Zmicier ★★★★★
()
Ответ на: комментарий от ashot

Вот специально толпу своих скриптов пересмотрел: нигде нет чистого баша!

Давай лучше пример скрипта, который делает что-то полезное, но написан на чистом баше!

anonymous
()
Ответ на: комментарий от d_a

Очень даже пригоден. Скажем, надо тебе отсортировать файлы в порядке убывания размера, как ты это без ls сделаешь гольными башевскими средствами?

anonymous
()
Ответ на: комментарий от ashot

Давай пример без enconv и sed:

#!/bin/sh
# this script has been written by Eddy
#
#       rename_translit --- переводит русские имена файлов в транслит
#
# Создан 22-го Май 2006 года в  9:24
#
rmspaces
for Name in `ls -1`
do
    Newname=`echo "$Name"|enconv|sed -e \
    "y/йукенгзхъфывапролдэсмитьбЙУКЕНГЗХЪФЫВАПРОЛДЭСМИТЬБ/jukengzh'fyvaproldesmit'bJUKENGZH'FYVAPROLDESMIT'B/"\
    -e "s/ц/tz/g"   \
    -e "s/ш/sh/g"   \
    -e "s/щ/sch/g"  \
    -e "s/ж/zh/g"   \
    -e "s/ч/ch/g"   \
    -e "s/ю/yu/g"   \
    -e "s/я/ya/g"   \
    -e "s/ё/yo/g"   \
    -e "s/Ё/YO/g"   \
    -e "s/Ц/TZ/g"   \
    -e "s/Ш/SH/g"   \
    -e "s/Щ/SCH/g"  \
    -e "s/Ж/ZH/g"   \
    -e "s/Ч/CH/g"   \
    -e "s/Ю/YU/g"   \
    -e "s/?/_/g"    \
    -e "s/Я/YA/g"`
    if [ "$Name" != "$Newname" ]; then
        mv "$Name" "$Newname"
    echo -e "$Name   ->    $Newname                             \r\c"
    fi
    if [ -d "$Newname" ]; then
    cd "$Newname" 2>/dev/null
    if [ $? == 0 ]; then
        echo -e "\n\nDiving into $Newname"
        rename_translit
        cd ../
    fi
    fi
done

anonymous
()
Ответ на: комментарий от anonymous

ну например конвертировать из hex -> dec

anonymous
()
Ответ на: комментарий от anonymous

Скажем, надо тебе отсортировать файлы в порядке убывания размера, как ты это без ls сделаешь гольными башевскими средствами?

https://unix.stackexchange.com/a/157905
Я не сказал что нельзя использовать внешние утилиты. Я сказал что выхлоп ls непригоден для машинного разбора и в скриптах ему не место.

d_a ★★★★★
()
Ответ на: комментарий от d_a

Ну приведенный однострочник тоже не сколько bash, сколько решить задачу. Нет же особой проблемы тот же пузырёк на bash сделать для сортировки.

vodz ★★★★★
()
Ответ на: комментарий от anonymous

Здравствуй, Эдик.

Давай пример без enconv

А чего мелочиться, давай я тебе fontforge на баше напишу.

и sed
"s/Ё/YO/g"

замена по вхождению есть:

${Name[@]//Ё/YO}
Аналога y/a/b пока нет, тут только костылить (перебор массивов, например).

for Name in `ls -1`

В этом треде уже недвусмысленно намекнули, что если имена файлов содержат пробелы или другую непотребщину, то будет «ой!». Лучше:

for Name in *

ashot ★★★★
()
Ответ на: комментарий от ashot

если имена файлов содержат пробелы или другую непотребщину

Для этого есть скрипт rmspaces, и вообще, стараюсь не именовать файлы запрещенными символами: кириллицей, пробелами, табуляциями и т.п.

anonymous
()
Ответ на: комментарий от ashot

А вообще, конечно, правильней всего find использовать, если нужно что-то рекурсивно обслужить. Потому как с for name in * тоже будут косяки.

anonymous
()
Ответ на: комментарий от Zmicier

И что же вам про него известно? Как вы собираетесь его сюда применить?


readarray array <<< "$(ls .. -n)" ;  for ((i = 0 ; i < ${#array[@]} ; i++ )); do some_utility ${array[$i]}; done

так

next_time ★★★★★
() автор топика
Последнее исправление: next_time (всего исправлений: 1)
Ответ на: комментарий от vel

спасибо, судя по man - xargs работает почти в точности, как я себе представлял такую команду

next_time ★★★★★
() автор топика
Ответ на: комментарий от next_time

Мать моя женщина! Это уже пхытоноперлом каким-то пованивает!

Нет, массивы в баше точно не нужны!!!

anonymous
()
Ответ на: комментарий от ashot

а) если забудешь кавычки вокруг переменной и б) (наиболее вероятно) — когда у тебя дофига файлов в директории.

Конструкцию вида for x in * нельзя в скриптах применять! В принципе, for x in $(ls -1) — та же фигня.

anonymous
()
Ответ на: комментарий от anonymous

стараюсь не именовать файлы запрещенными символами: кириллицей, пробелами, табуляциями и т.п.

Запрещённых символов ровно два: '/' и '\0'.

akk ★★★★★
()
Ответ на: комментарий от anonymous

если забудешь кавычки вокруг переменной

А если не забудешь?

когда у тебя дофига файлов в директории.

И?
Где обещанный косяк?

ashot ★★★★
()
Ответ на: комментарий от anonymous

нужны, но, крайне желательно, не в таком вырвиглазном виде, в каком они есть

next_time ★★★★★
() автор топика
Ответ на: комментарий от akk

А хрен там!

Кроме слеша, вопросительного знака, восклицательного знака, амперсанда и т.п. еще пробелы, табуляции, символы вне таблицы ASCII и ниже 33-го нельзя использовать в именовании файлов.

anonymous
()
Ответ на: комментарий от aedeph_

Вдогонку, чтобы в пустой директории звёздочку не выдавало:

shopt -s nullglob

ashot ★★★★
()
Ответ на: комментарий от ashot
aedeph@aedeph-ubuntu-PC:~/sandbox/bash/spaces$ ls -A
*
aedeph@aedeph-ubuntu-PC:~/sandbox/bash/spaces$ for name in *; do echo $name; done
*
aedeph@aedeph-ubuntu-PC:~/sandbox/bash/spaces$ rm \*
aedeph@aedeph-ubuntu-PC:~/sandbox/bash/spaces$ for name in *; do echo $name; done
*
aedeph_ ★★
()
Ответ на: комментарий от ashot

Идея скрытых файлов не нужна в скриптах. «Скрытых» файлов, которые не захватывает *, должно быть ровно два: . и ..

Deleted
()
Ответ на: комментарий от anonymous

А хрен там. Эскейпить надо, и всё можно.

akk ★★★★★
()
Ответ на: комментарий от anonymous

нельзя использовать в именовании файлов.

Прочитал в справочнике по IBM PC 1988-го года?

Deleted
()
Ответ на: комментарий от aedeph_

Заэскейпить забыл. Пробовал >*, ругается. Так: >\* тоже работает.

ashot ★★★★
()
Ответ на: комментарий от Deleted

Идея скрытых файлов не нужна в скриптах.

С идеями, товарищ, проследуйте в GNU, и там изложите. Мы здесь обсуждаем поведение баша, противоречащее официальной документации.

ashot ★★★★
()
Ответ на: комментарий от ashot

А что его обсуждать, единственный портабельный способ перечисления файлов - это find. Остальные костыли либо небезопасны, либо неуниверсальны.

Deleted
()
Ответ на: комментарий от Deleted

А что его обсуждать, единственный портабельный способ перечисления файлов - это find.

Неубедительно. См. посты выше.

портабельный

неуниверсальны

Насчёт портабельности и универсальности, это отдельная тема, но фразу «выстрелить себе в ногу» обычно применяют не к башу.

ashot ★★★★
()
Ответ на: комментарий от ashot

не к башу.

...а к пользователю.

Ты об этом?

Deleted
()
Ответ на: комментарий от Deleted

Мной! Я считаю ненормальными тех, кто запрещенные символы в имена файлов пхает. Или по-русски их обзывает, в результате такие «крякозяблы» в торрентокачалке... Благо, скрипт есть, который в транслит эту жесть переводит.

anonymous
()
Ответ на: комментарий от anonymous

Т.е. люди, которые нарушают заповеди Эдика-анонимуса, ненормальные. Ооок.

Что характерно, разрабов всех юникс-подобных ядер скопом в ненормальные записал, парень удалой.

Deleted
()
Ответ на: комментарий от anonymous

Я считаю ненормальными тех, кто запрещенные символы в имена файлов пхает.

Не могу с тобой не согласиться. Как «свидетель MS-DOS-а» скажу: 8/3 хватит всем.

ashot ★★★★
()
Ответ на: комментарий от Deleted

разрабов всех юникс-подобных ядер скопом в ненормальные записал

Где там в именах исходников пробелы или символы вне ASCII?

anonymous
()
Ответ на: комментарий от anonymous

Создал файл с «запрещенным» именем «↑↑↑↑↑.txt». Система молча проглотила. Вывод: Торвальдс ненормальный.

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.