YUKLA писал(а): ↑13.11.2009 18:10
Basic был приведён как реальный рабочий пример. Те их нас с вами, кто паял
ZX Spectrum, меня поймут. А те, кто работал в
Novell Netware, могут вспомнить пресловутый
NetBasic. Который, как раз очень расширял возможности шелла Netware server.
Не видел ни того ни другого, возможно поэтому не понимаю

Пример по ссылке - обычный basic скрипт, судя по всему имеющий доступ к каким-то системным вещам. Могу предположить, что нечто подобное можно было так или иначе набрать просто в basic shell'е, посмотреть результат, и если результат понравится сохранить скрипт в файл. В таком стиле можно писать на bash, за примерами далеко ходить не надо - можно init-скрипты посмотреть - обычный step-by-step с условиями.
Но. Это только одна часть того что можно делать на shell'е, не самая интересная кстати. О другой части можно думать как о постепенной трансформации потока данных. Придуманный пример:
..смотрим результат.. ок .. я хочу выбрать только тех пользователей у которых шелл "/bin/sh":
Код: Выделить всё
cat /etc/passwd | awk -F: '$NF~/\/bin\/sh/'
ок, вроде правильно. давайте оставим только имя пользователя и домашнюю папку:
Код: Выделить всё
cat /etc/passwd | awk -F: '$NF~/\/bin\/sh/{print $1,$(NF-1)}'
много лишнего. мне надо только те у которых домашняя папка /home:
Код: Выделить всё
cat /etc/passwd | awk -F: '$NF~/\/bin\/sh/{print $1,$(NF-1)}' | grep ' /home'
и теперь надо немного подрехтовать владельца, опасная операция, сначала надо проверить что все будет хорошо:
Код: Выделить всё
cat /etc/passwd | awk -F: '$NF~/\/bin\/sh/{print $1,$(NF-1)}' | grep ' /home' | while read i j; do echo chown -R $j:users $j; done
упс, ошибся
Код: Выделить всё
cat /etc/passwd | awk -F: '$NF~/\/bin\/sh/{print $1,$(NF-1)}' | grep ' /home' | while read i j; do echo chown -R $i:users $j; done
ок хорошо, лишних пробелов нет, могу просто передать это еще в один шелл:
Код: Выделить всё
cat /etc/passwd | awk -F: '$NF~/\/bin\/sh/{print $1,$(NF-1)}' | grep ' /home' | while read i j; do echo chown -R $i:users $j; done| sh
блин папок много хорошо бы оно еще писало какую уже сделало:
Код: Выделить всё
cat /etc/passwd | awk -F: '$NF~/\/bin\/sh/{print $1,$(NF-1)}' | grep ' /home' | while read i j; do echo chown -R $i:users $j; echo ls -ld $j; done
о так лучше, ну и пусть в лог тогда пишет:
Код: Выделить всё
cat /etc/passwd | awk -F: '$NF~/\/bin\/sh/{print $1,$(NF-1)}' | grep ' /home' | while read i j; do echo chown -R $i:users $j; echo ls -ld $j; done| sh | tee -a done.log
фух, сделало. упс, забыл что пользователи могут иметь шелл еще и /bin/bash. Не проблема, просто перезапустим:
Код: Выделить всё
cat /etc/passwd | awk -F: '$NF~/\/bin\/bash/{print $1,$(NF-1)}' | grep ' /home' | while read i j; do echo chown -R $i:users $j; echo ls -ld $j; done
теперь можно сохранить на память, поскольку я ленивый: открываю vim и вставляю в него две отработавшие строчки, заменяя /etc/passwd на $1. Пример придуманный, хотя сама строчка вполне обычна, и схема ее получения тоже. Мы постепенно выбрали из входных данных то что нам надо, и проделали над этим некоторую операцию. Строчку кстати можно существенно сократить, и вообще переписать используя совсем другой набор фильтров, но мы уже постепенно к ней пришли, и она уже выполнила свое черное дело, ну и хорошо. Хотелось бы увидеть пример подобной логики в Basic-shell'е. На самом деле это не трудно
читаемо переписать на любом скриптовом языке, просто логика будет несколько другой.