bash — как передать значения аргументов скрипту оболочки внутри cronjob

#bash #shell #unix

#bash #оболочка #unix

Вопрос:

У меня есть запись cron, которая выглядит следующим образом, которая работает: (передача через 5 входных данных)

 30 10 * * 5 sh /home/test.sh hostnm101.abc /mypath/dir test foobar F008AR >> /logs/mytst.log 2>amp;1
  

Я хочу изменить это, поэтому я сохраняю входные данные (4,5) foobar и F008AR в отдельном файле и считываю с помощью
скрипт test.sh ($ 4, $ 5)

test.sh

 #!/bin/bash

if [ $# != 5 ]; then
    exit 1
fi

DIRDT=`date ' %Y%m%d'`
TSTDIR=$2/test/$DIRDATE
[ ! -d "$TSTDIR" ] amp;amp; ( mkdir "$TSTDIR" || { echo 'mkdir command failed'; exit 1; } )

perl /home/dev/tstextr.pl -n $1 -b $2 -d $TSTDIR/ -s $3 -u $4 -p $5 -f $DIRDT
  

Есть ли какой-либо простой способ сделать это в cron для этих (2) входных значений? Спасибо.

Ответ №1:

Хорошо, попробуйте этот способ.

1) Создайте отдельный файл /mypath/dir/login.info с таким содержимым (имя пользователя / пароль в отдельных строках):

 foobar
F008AR
  

2) Измените свой test.sh вот так:

 #!/bin/bash
if [ $# != 4 ]; then
    exit 1
fi

DIRDT=`date ' %Y%m%d'`
TSTDIR=$2/test/$DIRDATE
[ ! -d "$TSTDIR" ] amp;amp; ( mkdir "$TSTDIR" || { echo 'mkdir command failed'; exit 1; } )

IFS="
"
arr=( $(<$2/$4) )
#echo "username=${arr[0]}   password=${arr[1]}"

perl /home/dev/tstextr.pl -n $1 -b $2 -d $TSTDIR/ -s $3 -u ${arr[0]} -p ${arr[1]} -f $DIRDT
  

3) Создайте свою команду cron следующим образом:

 30 10 * * 5 sh /home/test.sh hostnm101.abc /mypath/dir test login.info >> /logs/mytst.log 2>amp;1
  

Краткие сведения

  • IFS означает внутренний разделитель полей (IFS) в bash

Я использую это следующим образом:

 IFS="
"
  

Что означает, что в качестве разделителя полей следует использовать символ новой строки (поскольку мы храним имя пользователя и пароль в двух отдельных строках). И затем эта строка для чтения файла /mypath/dir/login.info в массив:

 arr=( $(<$2/$4) )
  
  • Первая строка (имя пользователя) считывается в $arr[0]
  • Вторая строка (пароль) считывается в $arr[1]

Вы можете повторить это, чтобы проверить прочитанное содержимое:

 echo "username=${arr[0]}"
echo "password=${arr[1]}"
  

Комментарии:

1. это круто! большое спасибо. Можете ли вы рассказать мне основы этого кода, начинающегося с IFS , и что он делает? Спасибо.

2. Добавлено некоторое объяснение в разделе summary выше. Рад, что у вас это сработало.

Ответ №2:

cron выполняется с помощью sh -c, поэтому:

 sh /home/test.sh hostnm101.abc /mypath/dir test `cat /mypath/dir/foobar_file` `cat /mypath/dir/F008AR_file` >> /logs/mytst.log 2>amp;