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

Исходное сообщение
"Тематический каталог: Bash-программирование (shell howto)"

Отправлено auto_topic , 22-Мрт-06 12:06 
Обсуждение статьи тематического каталога: Bash-программирование (shell howto)

Ссылка на текст статьи: http://www.opennet.me/base/dev/bash_help.txt.html


Содержание

Сообщения в этом обсуждении
"Bash-программирование (shell howto)"
Отправлено BigShadow , 22-Мрт-06 12:06 
"$@ - список параметров, переданных скрипту
$* - все параметры единой строкой"
типа одно и тоже? ;)
=======
"Встроенные параметры значительно упрощают всю сложность задач." - сложнопостигаемо, но блестяще закручено :)))
=======
"Существует 3 стандартных файловых дескриптора: ввод, вывод и вывод ошибки" - на самом деле дескриптор это число, т.е. существуют стандартные потоки в/в "ввод, вывод и вывод ошибки", которым соответствуют дескрипторы 0, 1 и 2.
=======
"<<file - перенаправление stdout для дозаписи в файл file" - если правильно, то будет так:
>>file
=======
">>string - ввод до подстроки string 'Ввод здесь'" - если правильно, то будет так:
<<string
=======
Пример:
mail -s "Hello" >> TheEnd >message.txt
root@localhost
mail1@mail.ru
mail2@mail.ru
mail3@mail.ru

TheEnd
ВООБЩЕ ВРЕДИТЕЛЬСКИЙ :-о !!!
=======
Пример:
for user in `cat users.txt` do
if grep $user stop.txt</dev/null 2<&1
then
echo Skip $user
else mail -s "Рассылка" $user >message.txt
fi
done
ВООБЩЕ ДИВЕРСИЯ ПРОТИВ СОЗНАНИЯ :(((
ошибки + крайне нерациональное решение
=======


"Bash-программирование (shell howto)"
Отправлено bot , 28-Май-06 14:29 
Может не туда запостил, но все равно думаю кому-то очень облегчит жизнь.
Делалось в какой-то институт, в шелл программировании не очень силен, но пришлось немного изучить, да и спасибо с некоторыми вопросами помогли добрые люди.
Вообщем вот код

root@portal11# cat lb
#!/bin/sh
#-xv # ключи для пошагового просмотра выполняемых операций

################################################################
### 1. Ввод с клавиатуры вашей фамилии в латинской транскрипции.
clear
echo Введите, пожалуйста, данные необходимые для выполнения скрипта:
while [ -z $surname ]
do
echo 1. Вашу фамилию в латинской транскрипции
read surname
done
################################################################
### 2. Ввод с клавиатуры вашей фамилии в латинской транскрипции.
work=0

while [ $work -ne 1 ]
do

while [ -z $new_dir ]
do
echo 2. Название новой \(рабочей\) директории
read new_dir
done
################################################################
### 3. Проверка, существует ли указанная папка в домашней дирек-
###    тории пользователя.
cd ~
if !([ -d $new_dir ]); then
################################################################
### 4. Создание в домашнем каталоге директории с введенным ранее
###    названием.
mkdir $new_dir
work=1
else echo Такая директория существует, введите новое имя директории:
read new_dir
fi
done
################################################################
### 5. Копирование из папки /usr/bin всех простых выполняемых
###    файлов, имеющих в своем имени первую букву моей фамилии в
###    в английской транскрипции в созданную папку.
pa=`echo $surname | cut -c1,1`
cpa="$pa*"
for i in /usr/bin/*
do
  if [ -x $i -a ! -d $i ]
  then cp /usr/bin/$cpa ~/$new_dir/
  fi
done
string=`ls ~/$new_dir/* | wc -l`
if [ $string -ne 30 ]
then
pb=`echo $surname | cut -c2,2`
cpb="$pb*"
cp /usr/bin/$cpb ~/$new_dir/
fi
################################################################
### 6. Если число скопированных файлов меньше 30, то повторяем
###    пункт 5, взяв следующую букву фамилии.
n=2
while [ $string -lt 31 ]
do
n=`expr $n + 1`
pab=`echo $surname | cut -c$n,$n`
cpab="$pab*"
cp /usr/bin/$cpab ~/$new_dir/
string=`ls ~/$new_dir/* | wc -l`
done
################################################################
### 7. Если не скопировано ни одного файла, то скопировать один
###    любой файл ненулевой длинны, имя которого содержит не
###    менее двух символов.
string=`ls ~/$new_dir/* | wc -l`
if [ $string -gt 30 ]
then
FILE=$(cd /usr/bin; ls | grep -v "^\." | grep "[a-zA-Z0-9]\{2,\}" | head -n1)
cp /usr/bin/$FILE ~/$new_dir/
fi
################################################################
### 8. Если число файлов все еще меньше 30, то создаем столько
###    копий первого файла из числа скопированных, чтобы общее
###    число файлов стало равным 30. Каждая новая копия содержит
###    в конце имени двухсимвольный суффикс с ее номером.
size=$(ls ~/$new_dir | wc -l)
count=`expr 30 - $size`
c=0
if [ $size -lt 30 ]; then
macro=$(ls ~/$new_dir | grep -v "^\." | head -n1)
until [ $c -eq $count ]
do
c=`expr $c + 1`

if [ $c -lt 10 ]; then
c="`echo 0$c | tr -d ' '`"
cp ~/$new_dir/$macro ~/$new_dir/$macro$c
fi

cp ~/$new_dir/$macro ~/$new_dir/$macro$c
done
fi
################################################################
### 9. Если число файлов больше 30, то удалить все лишние файлы,
###    оставив только 30 самых маленьких, но не пустых файлов.
count=0
size=$(ls ~/$new_dir | wc -l)
if [ $size -gt 30 ]; then
for i in $(ls -l ~/$new_dir | sort -k 5 | awk '{print $9}')
do
count=`expr $count + 1`
if [ $count -gt 29 ]; then
cd ~/; rm -f "$new_dir/$i"
fi
done
fi
################################################################
### 10. Ввод с клавиатуры имени файла, в который поместить пере-
###     чень всех файлов в нашей папке с указанием прав доступа
###     к ним, владельцев и размеров.
while [ -z $file_list ]
do
echo Введите, пожалуйста, имя файла, в который поместить перечень всех
echo файлов в Вашей папке с указанием прав доступа к ним, владельцев и размеров
read file_list
done
ls -ls $new_dir/* > ~/$new_dir/$file_list
################################################################
### 11. Сжатие файла с перечнем.
tar -cf ~/$new_dir/$file_list\.tar ~/$new_dir/$file_list
bzip2 -z -9 ~/$new_dir/$file_list\.tar
################################################################
### Конец скрипта.
root@portal11#