在bash脚本中传递参数

时间:2016-07-25 21:32:24

标签: bash shell parameter-passing

我有一个用于调用java类的bash脚本,我将两个参数传递给这个java类。第一个参数($ 1)是我传递的字符串,它包含某人的名字。第二个参数($ 2)是前一个月的两位数字(也由用户传入)。

所以java类就像这样调用:

 java -DCONFIG_DIR=... com.example.myapp.grades.gradingProcess $1 $2

但是,现在,我不希望用户传入第二个参数,而是希望脚本确定月份。
我可以这样做吗?

      month=`date +'%m' -d 'last month'`

 java -DCONFIG_DIR=... com.example.myapp.grades.gradingProcess $1 $month

当我运行我的剧本时,它会是这样的:./ myscript.sh' John' 因为我已经在脚本中做了这个,所以并没有通过一个两位数的月份?

或者这不是正确的方法吗? 对不起,如果这看起来像一个基本问题,我仍然试图习惯于打击脚本。

谢谢?

2 个答案:

答案 0 :(得分:2)

如果您正在寻找如何在shell中提供默认值,那么就有一个运算符。

month=${2-$(date -d 'last month' +%m)}

java -stuff "$1" "$month"

现在,如果$2中有值,则month将设置为该值;否则,将使用默认值。符号${variable-value}提供variable的值,如果未设置,则提供文本value。 (还有${variable:-value}如果设置了value,则生成variable,但也是空的。)

(这可以内联到java命令行中,尽管使用变量进行分解可能更易于理解。

java -stuff "$1" "${2-$(date -d 'last month' +%m)}"

另请注意,您基本上总是将用户提供的变量放在双引号中。)

答案 1 :(得分:0)

一些想法:时区,领先零,并利用Java而不是bash。

时区

确定当前月份需要当前日期。确定当前日期需要一个时区。

在任何特定时刻,日期在全球各地不同。例如,在巴黎午夜过后的几分钟是新的一天,而在蒙特利尔仍然是“昨天”。

如果未指定时区,则会隐式应用当前的默认时区。请注意,默认值可随时更改。根据默认值,您的代码依赖于直接控制之外的外部性。这意味着结果会有所不同。

因此,在月末或月初,您可能会在游戏时区中确定错误的月份数。

前导零可以表示Java中的八进制

您使用的%m会生成两位数字。单个数字的月份数字将具有前导零。例如:09

请注意,在Java的某些情况下,具有前导零的数字被解释为octal number(基数为8)而不是十进制数(基数为10)。

让Java完成工作

我建议让Java类做确定上个月的工作更有意义。如果有的话,bash行应该通过期望/预期的时区而不是月份。

ZoneId zoneId = ZoneId.of( "America/Montreal" ) ;
int previousMonthNumber = LocalDate.now( zoneId ).minusMonths( 1 ).getMonthValue() ;

提示:在Java中,使用Month枚举中的对象更好,而不仅仅是整数。使您的代码更具自我文档,类型安全并保证有效值。

Month month = LocalDate.now( zoneId ).minusMonths( 1 ).getMonth() ;