Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Languages
 С
 GNU С Library 
 Qt 
 STL 
 Threads 
 C++ 
 Samples 
 stanford.edu 
 ANSI C
 Libs
 LD
 Socket
 Pusher
 Pipes
 Encryption
 Plugin
 Inter-Process
 Errors
 Deep C Secrets
 C + UNIX
 Linked Lists / Trees
 Asm
 Perl
 Python
 Shell
 Erlang
 Go
 Rust
NEWS
Последние статьи :
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
  SQL 30.07   
  JFS 10.06   
  B-trees 01.06   
 
TOP 20
 P.Collins...1342 
 Steve Pate 1...791 
 QT->Qt3...509 
 Trees...433 
 Python...357 
 Steve Pate 3...340 
 TCP 2...316 
 Rodriguez 6...293 
 Rubni-Corbet -> Глав...291 
 Максвелл 3...290 
 TCP 3...289 
 Daniel Bovet 4...289 
 Mod_perl 2...279 
 Linux Inline Assembly...279 
 MySQL & PosgreSQL...273 
 Robert Love 2...265 
 UML 3...264 
 Rodriguez 2...264 
 Стивенс 6...262 
 Daniel Bovet 3...260 
 
  01.05.2017 : 2190164 посещений 

iakovlev.org

Base

Литерал - строка , заключенная в одиинарные кавычки и передаваемая в командной строке в качестве аргумента , например :
 	grep 'r.*t' /etc/passwd
Двойные кавычки работают по-другому - например в команде
 	echo "There is my path: $PATH"
будет выведено значение переменной PATH . Незакрытую одинарную кавычку надо предварять бак-слэшем :
 	echo I don\'t like contractions inside shell scripts.
В шелле есть ряд специальных переменных , значение которых изменить нельзя - это ряд
 	$1, $2, ...
Они включают в себя значение скриптовых параметров-аргументов . Если в скрипте записать 2 строки :
 	echo первый аргумент: $1
 	echo третий аргумент: $3  
назвать этот скрипт pshow и запустить команду
 	pshow раз два три  
то будет распечатано :
 	раз
 	три  
Команда shift удаляет эти переменные из списка , начиная с $1 . Например запишем в pshow :
 	echo Argument: $1
 	shift
 	echo Argument: $1
 	shift
 	echo Argument: $1
 	shift
Команда pshow раз два три распечатает
 	Argument: раз
 	Argument: два
 	Argument: три
Переменная $# хранит число аргументов , она используется в цикле при проходе через массив переменных с помощью команды shift . Переменная $@ хранит все скриптовые аргументы сразу . Переменная $0 хранит имя скрипта . Например :
 	echo $0: у этого скрипта следующие плохие параметры : $BADPARM 1>&2
ошибка в данном случае будет выведена в поток error . Для вывода в поток output :
 	echo $0: у этого скрипта следующие плохие параметры : $BADPARM 2>&1
Переменная $$ хранит ID-шник шелловского процесса . Переменная $? хранит exit code для последней выполненной шеллом команды .

Когда программа заканчивает работу , она посылает exit code родительскому процессу , которое представляет из себя число . Если оно равно нулю , то нет проблем . Если сначала запустить команду
 	ls / > /dev/null
а потом
 	echo $?
будет распечатан 0 . Если же сначала запустить такую команду
 	ls /фываыфва > /dev/null
а потом
 	echo $?
будет распечатано 1 . Если при работе скрипта возможны ошибки , их желательно обрабатывать и программно генерировать с помощью
 	exit 1
Некоторые программы возвращают свои собственные exit code . Так , diff или grep возвращают 1 в случае нахождения шаблона . В качестве ошибки они возвращают 2 .

Конструкция условия в шелле стандартная - это if/then/else :
 	if [ $1 = hi ]; then
 		echo 'Первый аргумент был "hi"'
 	elif [ $2 = "bye" ]; then
 	    echo 'Второй аргумент был "bye"'
 	else
 		echo -n 'Первый аргумент не был "hi" -- '
 		echo Он был '"'$1'"'
 	fi  
Символ [ - квадратные скобки - есть обязательный признак выполнения условия if . Если переменная $1 оказалось пустой , это можно обработать так :
 	if [ "$1" = hi ]; then
Вместо символа [ можно использовать grep :
 	if grep -q daemon /etc/passwd; then
 		echo The daemon user is in the passwd file.
 	else
 		echo There is a big problem. daemon is not in the passwd file.
 	fi
Дополнительные логические условия && и || могут быть использованы так :
 	if [ "$1" = hi ] || [ "$1" = bye ]; then
 		...
 	fi
Для проверки наличия существвания файла можно запустить
 	[ -f file ]>
 Типы файлов :  
 	-f - Regular file
 	-d - Directory
 	-h - Symbolic link
 	-b - Block device
 	-c - Character device
 	-p - Named pipe
 	-S - Socket  
 Следующие операторы проверяют файловые пермишины :
 	-r - Readable
 	-w - Writable
 	-x - Executable
 	-u - Setuid
 	-g - Setgid
 	-k - Sticky
Еще одна команда сравнивает 2 файла по дате модификации
 	[ file1 -nt file2 ]
При сравнении 2-х строк используются операторы = и != . Также есть 2 унарных операции проверки на пустоту строки:
 	[ -z "" ] returns 0
 	[ -n "" ] returns 1
Для сравнения чисел нужно использовать оператор eq :
 	[ 01 -eq 1 ]
Также возможны следующие унарные операции сравнения для чисел :
 	-eq - равно
 	-ne - не равно
 	-lt - меньше
 	-gt - больше
 	-le - меньше или равно
 	-ge - больше или равно  
 Оператор case применяется так :
 	case $1 in
 		bye)
 			echo Fine, bye.
 			;;
 		hi|hello)
 			echo Nice to see you.
 			;;
 		what*)
 			echo Whatever.
 			;;
 		*)
 			echo 'Huh?'
 			;;
 	esac
В шелле существуют 2 разновидности циклов - for и while . например :
 	for str in one two three four; do
 		echo $str
 	done
 Или так :
 	FILE=/tmp/whiletest.$$;
 	echo firstline > $FILE
 	while tail -10 $FILE | grep -q firstline; do
 		echo -n Number of lines in $FILE:' '
 		wc -l $FILE | awk '{print $1}'
 		echo newline >> $FILE
 	done
 	rm -f $FILE
Есть также until - версия цикла , похожая на while . Рекомендуется использовать for .

В шелле можно использовать output в качестве аргумента другой команды или сохранить его в переменной . В следующем примере результат работы команды grep передается в качестве аргумента команде sed :
 FLAGS=`grep ^flags /proc/cpuinfo | sed 's/.*://' | head -1`
 echo Your processor supports:
 for f in $FLAGS; do
         case $f in
                 fpu)    MSG="floating point unit"
                                 ;;
                 3dnow)  MSG="3DNOW graphics extensions"
                                 ;;
                 mtrr)   MSG="memory type range register"
                                 ;;
                 *)      MSG="unknown"
                                 ;;
         esac
         echo $f: $MSG
 done
Иногда возникает необходимость в создании временных файлов , для этого можно использовать команду mktemp. В следующем примере показано , как вывести прерывания за последние 2 секунды :
 	TMPFILE1=`mktemp /tmp/im1.XXXXXX`
 	TMPFILE2=`mktemp /tmp/im2.XXXXXX`
 	cat /proc/interrupts > $TMPFILE1
 	sleep 2
 	cat /proc/interrupts > $TMPFILE2
 	diff $TMPFILE1 $TMPFILE2
 	rm -f $TMPFILE1 $TMPFILE2
При этом mktemp конвертирует расширение XXXXXX в уникальный набор символов .

Утилита basename используется для выделения расширения из имени файла или избавления в имени файла от пути :
 	basename example.html .html
 	basename /usr/local/bin/example
В следующем скрипте выполняется конвертация gif-файла в png :
 	for file in *.gif; do
 		# exit if there are no files
 		if [ ! -f $file ]; then
 			exit
 		fi
 		b=`basename $file .gif`
 		echo Converting $b.gif to $b.png...
 		giftopnm $b.gif | pnmtopng > $b.png
 	done
awk - это не только полезная утилита , но и целый язык . С ее помощью можно , например , распечатать размеры файлов директории :
 	ls -l | awk '{print $5}'
sed - редактор потоков . sed получает набор строк для редактирования , а также набор правил для этого . Например , следующая команда удаляет в файле строки с 3-й по 6-ю :
 	sed 3,6d /etc/passwd
Другая полезная команда в sed - s - поиск или замена . Следующая команда делает замену шаблона exp на text
 	sed 's/exp/text/'
Следующая команда делает то же самое , но для всех text
 	sed 's/exp/text/g'
Следующая строка удаляет все строки , соответствующие шаблону :
 	sed '/exp/d'
expr - команда для выполнения арифметических операций . Например :
 	expr 1+2   
Выполните expr --help для распечатки полного списка .

subshells - это дочерний процесс , запускаемый в текущем шелле . Вызывается :
 	(cd subsheldi; subshellprog)
При этом все переменные родительского процесса сохраняются в дочернем . Например , в следующем примере создается архив текущего каталога , и распаковка происходит с помощью
 subshell уже в другом каталоге :
 	tar cf - orig | (cd target; tar xvf -)
 
Для включения в шелл других скриптов используйте оператор . (точка)

Команда read читает инпут и сохраняет его в переменной :
     read myvar    
Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье