Устранение неполадок скриптов



Другой способ запуска скрипта в отдельной оболочке Bash, это ввод имени скрипта в качестве параметра.

paul@debian6~/test$ bash runme

42

Расширение bash –xпозволяет увидеть команды, которые выполняет оболочка (после её расширения).

paul@debian6~/test$ bash -x runme

+ var4=42

+ echo 42

42

paul@debian6~/test$ cat runme

# the runme script

var4=42

echo $var4

paul@debian6~/test$

Обратите внимание на отсутствие строки комментария (#) и замены переменной перед выполнением echo.

Предотвращение имитации корня setuid

Некоторые пользователи могут попытаться выполнить подмену основы скрипта setuid. Это редкое, но возможное явление. Для повышения безопасности скрипта, и чтобы избежать подмены переводчика, вам нужно добавить -- после #!/bin/bash, он отключает опцию дальнейшей обработки, чтобы команда не принимала никаких вариантов!.

#!/bin/bash -

or

#!/bin/bash --

Любые аргументы после -- рассматриваются как имена файлов и аргументы. Аргумент - эквивалентен --.

Глава 20. scripting loops

20.1. test [ ]

Тестовая команда может проверить, является ли что-то истинным или ложным. Давайте начнем с того, что удостоверимся, что 10 больше, чем 55.

[paul@RHEL4b ~]$ test 10 -gt 55 ; echo $?

1

[paul@RHEL4b ~]$

Тестовая команда возвращает 1, если тест не пройден. И, как вы увидите в следующем примере, что тест возвращает 0, когда проверка проходит успешно.

[paul@RHEL4b ~]$ test 56 -gt 55 ; echo $?

0

[paul@RHEL4b ~]$

Если вы предпочитаете true и false, то напишите команду test, как эту.

[paul@RHEL4b ~]$ test 56 -gt 55 && echo true || echo false

true

[paul@RHEL4b ~]$ test 6 -gt 55 && echo true || echo false

false

Тестовая команда также может быть записана в квадратных скобках, пример ниже идентичен примеру выше.

[paul@RHEL4b ~]$ [ 56 -gt 55 ] && echo true || echo false

true

[paul@RHEL4b ~]$ [ 6 -gt 55 ] && echo true || echo false

false

Ниже приведены примеры некоторых тестов. Взгляните на man test, чтобы увидеть больше вариантов.

[ -d foo ] Does the directory foo exist ?

[ -e bar ] Does the file bar exist ?

[ '/etc' = $PWD ] Is the string /etc equal to the variable $PWD ?

[ $1 != 'secret' ] Is the first parameter different from secret ?

[ 55 -lt $bar ] Is 55 less than the value of $bar ?

[ $foo -ge 1000 ] Is the value of $foo greater or equal to 1000 ?

[ "abc" < $bar ] Does abc sort before the value of $bar ?

[ -f foo ] Is foo a regular file ?

[ -r bar ] Is bar a readable file ?

[ foo -nt bar ] Is file foo newer than file bar ?

[ -o nounset ] Is the shell option nounset set ?

Тесты могут быть объединены с логическим И и ИЛИ.

paul@RHEL4b:~$ [ 66 -gt 55 -a 66 -lt 500 ] && echo true || echo false

true

paul@RHEL4b:~$ [ 66 -gt 55 -a 660 -lt 500 ] && echo true || echo false

false

paul@RHEL4b:~$ [ 66 -gt 55 -o 660 -lt 500 ] && echo true || echo false

true

 

 

Если, затем, иначе (if then else)

if then elseэто конструкции выбора. if определенное условие, then выполнить что-то, else исполняем что-то другое. В приведенном ниже примере проверяем, существует ли файл, и если файл существует, то соответствующее сообщение будет отображено.

#!/bin/bash

if [ -f isit.txt ]

then echo isit.txt exists!

else echo isit.txt not found!

fi

Если мы назовём этот скрипт как «выбор», то он работает, как этот.

[paul@RHEL4a scripts]$ ./choice

isit.txt not found!

[paul@RHEL4a scripts]$ touch isit.txt

[paul@RHEL4a scripts]$ ./choice

isit.txt exists!

[paul@RHEL4a scripts]$

If then elif

Вы можете вложить внутрь else новый if, с помощью elif. Вот простой пример.

#!/bin/bash

count=42

if [ $count -eq 42 ]

then

echo "42 is correct."

elif [ $count -gt 42 ]

then

echo "Too much."

else

echo "Not enough."

fi

For loop

В приведенном ниже примере показан синтаксис классического цикла в bash.

for i in 1 2 4

do

echo $i

done

Пример цикла в сочетании со встроенной оболочкой.

#!/bin/ksh

for counter in `seq 1 20`

do

echo counting from 1 to 20, now at $counter

sleep 1

done

Примера выше можно написать без встроенной оболочки, используя Bash {от .. до} границы.

#!/bin/bash

for counter in {1..20}

do

echo counting from 1 to 20, now at $counter

sleep

Этот цикл использует файл подстановки (от расширения оболочки). Ввод инструкции в командной строке имеет одинаковую функциональность.

kahlan@solexp11$ ls

count.ksh go.ksh

kahlan@solexp11$ for file in *.ksh ; do cp $file $file.backup ; done

kahlan@solexp11$ ls

count.ksh count.ksh.backup go.ksh go.ksh.backup

While loop

Ниже приведен простой пример while loop цикла.

i=100;

while [ $i -ge 0 ] ;

do

echo Counting down, from 100 to 0, now at $i;

let i--;

done

Бесконечный цикл может быть сделан с помощью while trueили while : ,где двоеточие является эквивалентом операции «нет» в оболочках Korn и Bash.

#!/bin/ksh

# endless loop

while :

do

echo hello

sleep 1

done

Until loop

Ниже приведен простой пример until loop цикла.

let i=100;

until [ $i -le 0 ] ;

do

echo Counting down, from 100 to 1, now at $i;

let i--;

done

 

To parse – определять

option – вариант

Глава 21 Sсript parameters.

                                                         

Script parameters.

Скрипт bashshell может иметь параметры. Нумерация, которую вы видите в скрипте, приведенном ниже, продолжится, если у вас будет больше параметров. Также есть специальные параметры, содержащие количество параметров, строку из всех параметров, а также process id и код возврата. В мануале по bashприведен полный список.

#!/bin/bash

echo The first argument is $1

echo The second argument is $2

echo The third argument is $3

echo \$ $$ PID of the script

echo \# $# count arguments

echo \? $? last return code

echo \* $* all the arguments

Ниже представлен результат работы скрипта сверху.

[paul@RHEL4a scripts]$ ./pars one two three

The first argument is one

The second argument is two

The third argument is three

$ 5610 PID of the script

# 3 count arguments

? 0 last return code

* one two three all the arguments

Ещё раз тот же скрипт, только с 2-мя параметрами.

[paul@RHEL4a scripts]$ ./pars 1 2

The first argument is 1

The second argument is 2

The third argument is

$ 5612 PID of the script

# 2 count arguments

? 0 last return code

* 1 2 all the arguments

[paul@RHEL4a scripts]$

Вот другой пример, в котором мы используем $0. Параметр $0 содержит имя скрипта.

paul@debian6~$ cat myname

echo this script is called $0

paul@debian6~$ ./myname

this script is called ./myname

paul@debian6~$ mv myname test42

paul@debian6~$ ./test42

this script is called ./test42

 

Shift through parameters.

Оператор shiftможет определять параметры один за другим.

 

kahlan@solexp11$ cat shift.ksh

#!/bin/ksh

if [ "$#" == "0" ]

then

echo You have to give at least one parameter.

exit 1

fi

while (( $# ))

do

echo You gave me $1

shift

done

Ниже приведен пример вывода этого скрипта.

kahlan@solexp11$ ./shift.ksh one

You gave me one

kahlan@solexp11$ ./shift.ksh one two three 1201 "33 42"

You gave me one

You gave me two

You gave me three

You gave me 1201

You gave me 33 42

kahlan@solexp11$ ./shift.ksh

You have to give at least one parameter.

Runtime input.

В скрипте вы можете запросить ввод от пользователя при помощи команды read.

#!/bin/bash

echo -n Enter a number:

read number

Sourcing a config file.

Source(как было показано в главах про shell) может быть использован to source файла конфигурации.

Ниже представлен пример файла конфигурации для приложения.

[paul@RHEL4a scripts]$ cat myApp.conf

# The config file of myApp

# Enter the path here

myAppPath=/var/myApp

# Enter the number of quines here

quines=5

Вот приложение, использующее этот файл.

[paul@RHEL4a scripts]$ cat myApp.bash

#!/bin/bash

#

# Welcome to the myApp application

#

. ./myApp.conf

echo There are $quines quines

Запущенное приложение может использовать значения внутри sourced файла конфигурации.

[paul@RHEL4a scripts]$ ./myApp.bash

There are 5 quines

[paul@RHEL4a scripts]$


Дата добавления: 2018-04-05; просмотров: 348; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!