Добрый день! У меня есть этот сценарий:
#!/bin/sh
# Оболонка для ping
# ІНІЦІАЛІЗАЦІЯ ЗМІННИХ
CONFIG_FILE=$HOME/pingall-hosts # Ім'я конфігураційного файлу
TARGET= # Ціль
VERBOSE=off # Перемикач говірливості
COUNTER=0 # Лічильник прозондованих вузлів
# ВИЗНАЧЕННЯ ФУНКЦІЙ
# pingone - Зондує один віддалений вузол
pingone()
{
ping -n -c3 -l3 -w2 $TARGET; echo
# Інкремент лічильника прозондованих вузлів
COUNTER=`expr $COUNTER + 1`
}
# usage - Виводить інформацію про синтаксис
usage()
{
echo "usage: `basename $0` [-h] | [<-t target | -c config_file> [-v]]" >&2
}
# before_exit - Виводить прощавальне повідомлення
before_exit()
{
if [ $VERBOSE = on ]; then
if [ $COUNTER -eq 1 ]; then
ENDING=""
COPULA="is"
else
ENDING="s"
COPULA="are"
fi
echo "$COUNTER host$ENDING $COPULA probed"
echo "Bye..."
fi
}
# read_target - Читає чергову ціль
read_target()
{
while read TARGET
do
if [ ! -z "$TARGET" -a `expr match "$TARGET" "#"` -eq 0 ]; then
return 0 # Читання вважається успішним, якщо прочитаний рядок
# не порожній і не містить #
fi
done
return 1
}
# ТІЛО СЦЕНАРІЯ
# Аналіз параметрів
while getopts ht:c:v OPTION
do
case $OPTION in
h)
usage
exit 0
;;
t)
TARGET=$OPTARG
;;
c)
CONFIG_FILE=$OPTARG
;;
v)
VERBOSE=on
;;
\?) # Невідома опція
usage
exit 1
esac
done
# Виведення привітання
if [ $VERBOSE = on ]; then
echo "It's `date +%k:%M:%S` now. Pingall v1.0 is starting..."
fi
# Обробка цілі, явно заданої в командному рядку
if [ ! -z $TARGET ]; then
pingone
before_exit
exit 0
fi
# Обробка конфігураційного файлу
if [ -z $CONFIG_FILE ]; then
# Конфігураційний файл не заданий
echo "Configuration file is not defined" >&2
exit 1
fi
if [ ! -f $CONFIG_FILE ]; then
# Конфігураційний файл не існує
echo "Configuration file $CONFIG_FILE is not exist" >&2
exit 1
fi
# Підключення стандартного потоку введення до конфігураційного файлу
exec 3<&0 0<$CONFIG_FILE
# Зондування цілей, заданих у конфігураційному файлі
while read_target
do
pingone
done
# Відновлення стану стандартного потоку введення
exec 0<&3
# Виведення прощального повідомлення
before_exit
Как может я улучшаться, это, чтобы рассчитать, распечатать сумму успешных тестов и взять аргументы, определило этот путь в Терминале:
sh thisScript.sh 127.0.0.1 127.0.0.1
Спасибо!
Выполненный
sed -i.bak '/^TARGET=/s/=/="$1"/' /path/to/your/script.sh
изменить строку 6 из него к TARGET="$1"
, этот путь $TARGET
будет присвоен первому аргументу, который Вы даете сценарию. Теперь на Вас может уже назвать его как
/path/to/your/script.sh 127.0.0.1
и это будет действовать, как будто была строка TARGET="127.0.0.1"
внутри.
Для запущения скрипта в списке целей, можно использовать, например, a for
цикл следующим образом:
for i in 127.0.0.[123] 192.168.10.1; do sh /path/to/your/script.sh $i; done
Это назвало бы сценарий с аргументами 127.0.0.1
, 127.0.0.2
, 127.0.0.3
и 192.168.10.1
один за другим.