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
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 Linux Kernel 2.6...5164 
 Trees...935 
 Максвелл 3...861 
 Go Web ...815 
 William Gropp...796 
 Ethreal 3...779 
 Ethreal 4...766 
 Gary V.Vaughan-> Libtool...765 
 Rodriguez 6...756 
 Steve Pate 1...749 
 Ext4 FS...748 
 Clickhouse...748 
 Ethreal 1...736 
 Secure Programming for Li...721 
 C++ Patterns 3...712 
 Ulrich Drepper...693 
 Assembler...687 
 DevFS...655 
 Стивенс 9...644 
 MySQL & PosgreSQL...622 
 
  01.01.2024 : 3621733 посещений 

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    
Оставьте свой комментарий !

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

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