понедельник, 1 июля 2013 г.

BASH & TCSH, сходства/различия, предпочтения

BASH (Bourne-Again Shell)

В любом текстовом редакторе создадим файл с именем test.
Скрипт всегда должен начинаться со строки:
#!/bin/bash
Это нужно для того, чтобы явно не указывать файлу, каким интерпретатором его запускать.

Пример содержимого файла test:
#!/bin/bash
# это комментарий
echo Hello World!


Первая строка указывает интерпретатор /bin/bash (символы #!).
Вторая строка - комментарий. Комментарий начинается с символа #.
Третья строка использует команду echo (печать текста на экран) и в качестве аргумента принимает строку "Hello World".


Для того чтобы запустить этот скрипт его нужно сделать исполняемым, для этого существует команда chmod +x <имя_файла>.

Пример:
$ chmod +x test

Теперь этот файл можно запустить:
./test
Hello World!



Переменные.

Объявление переменной: 
переменная=значение

Тут все понятно. Запомните, вокруг знака = не должно быть пробелов!

Пример объявления:
A=3
STR=text


Использование переменной: 
$переменная

Пример:
L=15 #объявили переменную
echo $L #вывод значения переменной


Результат работы скрипта:
15

При использовании переменной знак $ - обязателен!

Чтение значения переменной, введенной с клавиатуры:
read ПЕРЕМЕННАЯ

Пример:
echo Введите ваше имя: #приглашение ввести имя
read TEST #чтение введенного вами имени
echo Вас зовут $TEST #вывод вашего имени на экран


Присваивание значение переменной со стандартного вывода:
LS=`ls` #значение переменной равно выводу команды ls
echo $LS


Обратите внимание на обратные апострофы `` а не ''.

Существуют также переменные окружения, это зарезервированные переменные, они зарезервированы оболочкой, например HOSTNAME, EDITOR и другие.
Посмотреть все переменные окружения можно командой:
$ printenv

Создать свою переменную окружения можно командой:
$TEST=blablabla
export $TEST


После этого, переменная TEST, будет доступна в других скриптах этой bash-сессии.

Параметры сценария.

$0 - имя скрипта;
$n - значение параметра (n - номер параметра);
$# - количество параметров, которые были переданы.

Пример:
#!/bin/bash
#имя_скрипта параметр_1
#./test print {1|2|*}
if [ $1 -eq 1 ]
then
   echo Введен параметр 1!
elif [ $1 -eq 2 ]
then
   echo Напишите что-то:
   read A
   echo Введен параметр 2, я прочел вашу строку, вы написали $A
else
   echo Такой параметр не поддерживается!
fi


Скрипт читает один параметр:
- если параметр = 1, то вывод "Введен параметр 1!";
- если параметр = 2, то запрашивается ввод с консоли, и выводится введенная вами строка;
- если параметр не 1 и не 2, то вывод "Параметр не поддерживается".

Пример выполнения программы:
./test 1
Введен параметр 1!


./test 2
Напишите что-то:
Privet!
Введен параметр 2, я прочел вашу строку, вы написали Privet!


./test 3
Такой параметр не поддерживается!


На if'ы пока внимание не обращайте, рассмотрим это дальше.

Массивы.

Тут все просто, массивы объявляются как переменные с индексом:
массив[номер]=значение

Вывод элемента массива:
${массив[номер]}

Пример:
ARRAY[0]=1
ARRAY[1]=2
echo ${ARRAY[0]}


Вывод:
1


Циклы.

Всего в bash используется 4 цикла: for, while, until, select.
Последние 2 редко используются, поэтому опишу первые два (for, while).

FOR
Синтаксис:
for переменная in список
do
команды
done


Пример:
for n in 1 2 3;
do
echo $n;
done


!!! Списки значений и команд заканчиваются символом ;

Вывод скрипта:
1
2
3


WHILE
Синтаксис:
while условие
do
команды
done


Тот же самый пример как и в FOR, вывод одинаковый:
n=1 #объявили переменную равную 1
while [ $n -lt 4 ] #пока n не равно 4
do
   echo $n
   n=$(( $n+1 )); #n=n+1
done


Условные операторы.

if-else
Синтаксис:
if условие
then
   команды
elif условие
then
   команды
else
   команды
fi


Тут все понятно. Количество elif неограничено.

Пример использования:
if [ $A==10 ] #если a=10
then
   echo a=10
elif [ $A!=10 && $A -lt 11] #если a!=10 и a<11
then
   echo a!=10 и a<11
else #иначе (если a!=10 и a>11)
   echo a!=10 и a>11

В операциях сравнения нет < или > и т.д, а специальные выражения.
Мне они напоминают Ассемблеровские.
-lt - меньше (less);
-gt - больше (great);
-le - меньше или равно (less equal);
-ge - больше или равно (great equal);
-eq - равно (==) (equal).

Пример:
#B<9
[ $B -lt 9 ]
#C=12
[ $C -eq 12 ]


Проверка существования файла или каталога:
-e файл - true, если файл существует;
-d каталог - true, если каталог существует;
-x файл - true, если файл исполняемый (+x).

Пример:
#!/bin/bash
if [ -e 'file' ]
then
   echo Файл существует.
else
   echo Нет.
fi


case-esac
Синтаксис:
case переменная in
значение1) команды ;;
...
значениеN) команды ;;
*) команды ;;
esac


Пример:
#!/bin/bash
read A
case $A in
1) echo Вы ввели 1 ;;
2) echo Вы ввели 2 ;;
3) echo Вы ввели 3 ;;
*) echo Вы ввели !1,2,3
esac


Функции.

Синтаксис:
имя() { команды; }

Пример:
#!/bin/bash
main() {
   echo Hello!
}
mine() {
   echo World!
}
main
mine

exit 0

TCSH (Tenex C Shell)

Переменные.

Синтаксис:
set переменная = значение
Пример:
set A = text
echo $A


Переменные окружения:
setenv переменная значение

setenv EDITOR vi

Массивы.

Пример:
set MAS = (1 2 3 4 5)
echo $MAS
echo $MAS[4]
echo $MAS[1-3]

Результат выполнения:
1 2 3 4 5
4
1 2 3


#!/bin/tcsh
set MAS = (0 0 0 0 0)
@ MAS[1] = 10
@ MAS[3] = ($MAS[1] + 5)
echo $MAS[3]
15

Нумерация элементов начинается с 1.

Числовые переменные.

Синтаксис:
@ переменная оператор выражение
где оператор: =, +=, -=, *=, /=, %=.
Вот за это я люблю TCSH.

Примеры:
@ N = 0
echo $N
0

@ N = ( 2 + 2 ) * 2
echo $N
8


@ N++

После @ обязательно должен стоять пробел.

Чтение ввода с клавиатуры.

"$<"

Пример:
echo -n "Ввод строки: "
set A = "$<"
echo Вы ввели $A


Применение скобок.

set A=hel
echo ${A}lo
hello


Условные операторы.

if
Синтаксис:
if (выражение) команда

Пример:
if -e $1 #-e существует ли файл?
echo "Файл существует"

-e - это одно из выражений, доступное в TCSH.
Там их много, если надо найдете.

if-then-else
Синтаксис:
if (выражение) then
   команды
else if (выражение) then
   команды
else
   команды
endif


Пример:
#!/bin/tcsh
set A = $argv[1] #получили 1й аргумент
set B
if ($A < 0) then
   @ B = 1
else if (0 <= $A && $A <10) then
   @ B = 2
else
   @ B = 3
endif
   echo "Arg: ${B}"


Тут все просто.

switch
Синтаксис:
switch (строка)
case образец:
   команды
breaksw
case образецN:
   команды
breaksw
...
default:
   команды
breaksw
endsw


Пример:
set A = test
switch (A)
case test:
   echo "TEST"
breaksw
case text:
   echo "TEXT"
breaksw
default:
   echo "NOT TEST/TEXT"
breaksw
endsw


Циклы.

foreach
Синтаксис:
foreach индекс_цикла (список_аргументов)
   команды
end


Удобен при работе с массивами.

Пример:
#вывод файлов с расширением .odt
foreach e ( *.odt )
echo $e
end


while
Синтаксис:
while
   команды
end


Пример:
#!/bin/tcsh
#факториал
set A = $argv[1]
set i = 1
set fact = 1
while ($i <= $A)
   @ fact *= $i
   @ i++
end
echo "Факториал числа $A равен $fact."


В циклах можно использовать break и continue.
break - прерывает цикл и выходит из него, выполняя следующую операцию после end.
continue - прерывает итерацию.

В общем-то есть что сравнить. Мне язык TCSH показался больше похожим на C/Java, да и вообще на многие нормальные ЯП, однако к BASH я уже привык.

Почему я сравнивал BASH и TCSH, потому что, BASH - самая распространенная оболочка, а TCSH стоит по умолчанию во FreeBSD, которую, я, впоследствии хочу поглядеть.

Комментариев нет: