Почему мой скрипт rc.d получает аргумент "start" или "stop"?
Моя цель - создать службу сценария bash, которая создает файл, когда уровень запуска равен 5, и удалить этот файл, когда уровень запуска равен 3.
Проблема, которую я получил, - когда я достиг уровня запуска 3. Я получил:
Почему он получает аргумент начала, и я не передавал никаких аргументов.Текущий уровень: 3 и количество аргументов: 1 Я в строке 10 . Команда запускается
Функция start предназначена для создания файла, а функция stop предназначена для удаления файла, и они работают нормально.
Я могу заставить скрипт работать нормально, если уберу условие проверки количества аргументов и позволю скрипту просто удалить файл, когда он на уровне 3
но то, что он говорит мне, что число аргументов равно 1 и начинается, не приходит мне в голову. Я уже провел много исследований, и я не нашел никакого решения.
#! /bin/bash
# chkconfig: 35 99 01
# description : some startup script
#### Constants
FILE="/home/ayadi/Desktop/inittp"
CURRENT_LVL="$(runlevel | awk '{print $2}')"
echo "The current lvl is : $CURRENT_LVL and number of arguments is : $# "
echo "I am at line 10 . The command is $1"
#### Functions
start(){
if ! [[ -f "$FILE" ]];
then
touch "$FILE"
echo "File Created..."
else
echo "File Does Exist..."
fi
}
stop(){
if [[ -f "$FILE" ]];
then
rm "$FILE"
echo "File Deleted..."
else
echo "File Does Not Exist..."
fi
}
#### Main
if [ $# -eq 0 ]
then
echo "Entred the arguments -eq 0"
if [ "$CURRENT_LVL" == "5" ]
then
echo "Entred the if current lvl 5 statement"
start
fi
if [ "$CURRENT_LVL" == "3" ]
then
echo "Entred the if current lvl 3 statement"
stop
fi
else
case "$1" in
[sS][tT][aA][rR][tT])
if ! ([ -e "$FILE" ])
then
echo "I am the case statement.the command is $1"
start
fi
;;
[sS][tT][oO][pP])
if [ -e "$FILE" ]
then
stop
fi
;;
*)
echo "Please enter start or stop"
;;
esac
fi
2 ответа
Совет отладки, измените это:
echo "The current lvl is : $CURRENT_LVL and number of arguments is : $# "
echo "I am at line 10 . The command is $1"
К этому:
echo "The current lvl is : $CURRENT_LVL and number of arguments is : $# "
echo "I am at line 10 . The command is \"$1\", the whole command line is \"$0 $@\""
Это не решит проблему, но даст больше информации о том, что на самом деле происходит.
#Main
можно упростить Это ничего не решит, но будет легче думать о:
#### Main
case "${1,,}" in
"") echo "Entered no arguments."
case "$CURRENT_LVL" in
3|5) echo "Entered the if current level ${CURRENT_LVL} statement" ;;&
5) start ;;
3) stop ;;
esac ;;
start) if ! [ -e "$FILE" ] ; then
echo "I am the case statement.the command is $1"
start
fi ;;
stop) [ -e "$FILE" ] && stop ;;
*) echo "Please enter start or stop" ;;
esac
Обратите внимание bash
измс. ${1,,}
возвращается $1
в нижнем регистре. ;;&
падает к следующему case
тест, а не прыгать ecase
,
По умолчанию, когда служба вызывается для автоматического запуска на определенном уровне выполнения, ей присваивается аргумент "start".