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!
$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
Последние 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 условие
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
Результат выполнения:
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
-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
В любом текстовом редакторе создадим файл с именем 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
Использование переменной:
Тут все понятно. Запомните, вокруг знака = не должно быть пробелов!
Пример объявления:
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-сессии.
Пример:
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
echo $A
Переменные окружения:
setenv переменная значение
setenv EDITOR vi
Массивы.
Пример:
set MAS = (1 2 3 4 5)
echo $MAS
echo $MAS[4]
echo $MAS[1-3]
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
Числовые переменные.
Синтаксис:@ переменная оператор выражение
где оператор: =, +=, -=, *=, /=, %=.
Вот за это я люблю TCSH.
Примеры:
@ N = 0
echo $N
0
@ N = ( 2 + 2 ) * 2
echo $N
8
@ N++
После @ обязательно должен стоять пробел.
Пример:
echo -n "Ввод строки: "
set A = "$<"
echo Вы ввели $A
echo ${A}lo
hello
Синтаксис:
if (выражение) команда
Пример:
if -e $1 #-e существует ли файл?
echo "Файл существует"
@ N = ( 2 + 2 ) * 2
echo $N
8
@ N++
После @ обязательно должен стоять пробел.
Чтение ввода с клавиатуры.
"$<"Пример:
echo -n "Ввод строки: "
set A = "$<"
echo Вы ввели $A
Применение скобок.
set A=helecho ${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, которую, я, впоследствии хочу поглядеть.
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, которую, я, впоследствии хочу поглядеть.
Комментариев нет:
Отправить комментарий