bash - 如何将 arg 值传递给 cronjob 中的 shell 脚本

发布于 2024-11-06 15:36:03 字数 645 浏览 0 评论 0原文

我有一个看起来像这样的 cron 条目,它可以工作:(传递 5 个输入)

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

我想更改它,因此我将输入 (4,5) foobarF008AR 存储在单独的文件并读入 script 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" ] && ( 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

对于这 (2) 个输入值,有没有简单的方法可以在 cron 中执行此操作?谢谢。

I have cron entry that looks like this which works: (passing in 5 inputs)

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

I want to change it so I store inputs (4,5) foobar and F008AR in a separate file and read in by
script 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" ] && ( 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

Is there any easy way to do this within the cron for those (2) input values? Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

感性 2024-11-13 15:36:03

好吧,试试这个方法。

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" ] && ( 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>&1

摘要

  • IFS代表bash中的内部字段分隔符(IFS)

我像这样使用它:

IFS="
"

这意味着将换行符作为字段分隔符(因为我们将用户名和密码存储在2个单独的行中) 。然后这一行将文件 /mypath/dir/login.info 读入数组:

arr=( $(<$2/$4) )
  • 第一行(用户名)读入 $arr[0]
  • 第二行(密码) 被读入 $arr[1]

您可以 echo 来检查读取的内容:

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

Alright try this way.

1) Create a separate file /mypath/dir/login.info with content like this (username/password in separate lines):

foobar
F008AR

2) Modify your test.sh like this:

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

DIRDT=`date '+%Y%m%d'`
TSTDIR=$2/test/$DIRDATE
[ ! -d "$TSTDIR" ] && ( 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) Have your cron command like this:

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

Summary

  • IFS stands for Internal Field Separator (IFS) in bash

I am using it like this:

IFS="
"

Which means make new line character as field separator (since we are storing username and password in 2 separate lines). And then this line to read file /mypath/dir/login.info into an array:

arr=( $(<$2/$4) )
  • First line (username) is read into $arr[0]
  • Second line (password) is read into $arr[1]

You can echo it to check read content:

echo "username=${arr[0]}"
echo "password=${arr[1]}"
苍风燃霜 2024-11-13 15:36:03

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>&

cron executes with sh -c so:

sh /home/test.sh hostnm101.abc /mypath/dir test `cat /mypath/dir/foobar_file` `cat /mypath/dir/F008AR_file` >> /logs/mytst.log 2>&
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文