Устранение неполадок скриптов
Другой способ запуска скрипта в отдельной оболочке 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!