我有一个用于调用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' 因为我已经在脚本中做了这个,所以并没有通过一个两位数的月份?
或者这不是正确的方法吗? 对不起,如果这看起来像一个基本问题,我仍然试图习惯于打击脚本。
谢谢?
答案 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。
确定当前月份需要当前日期。确定当前日期需要一个时区。
在任何特定时刻,日期在全球各地不同。例如,在巴黎午夜过后的几分钟是新的一天,而在蒙特利尔仍然是“昨天”。
如果未指定时区,则会隐式应用当前的默认时区。请注意,默认值可随时更改。根据默认值,您的代码依赖于直接控制之外的外部性。这意味着结果会有所不同。
因此,在月末或月初,您可能会在游戏时区中确定错误的月份数。
您使用的%m
会生成两位数字。单个数字的月份数字将具有前导零。例如:09
请注意,在Java的某些情况下,具有前导零的数字被解释为octal number(基数为8)而不是十进制数(基数为10)。
我建议让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() ;