谷歌没有帮助我。
#!/bin/sh
j1=`expr "$1"`
j2=`expr "$2"`
while [ $j1 -le $j2 ]; do
date=$(ncal -e $j1)
month=$($date | cut -f1 -d' ')
if [ $month=="April" ]; then
echo $date
fi
j1=`expr $j1 + 1`
done
我只想打印四月的复活节日期(在我作为参数传递的两年之间的范围内)。但不知何故我得到了输出:
...
April 5 2015
./script.sh: 8: March: not found
March 27 2016
./script.sh: 8: April: not found
April 16 2017
“月份:未找到”是什么意思?尽管我只要求四月,但为什么它打印三月?
我尝试了各种方法,但总是出现一些错误。
我还需要添加一个条件,即只打印 4 月 20 日之后的日期,但我什至无法处理这个问题。
答案1
在线上
month=$($date | cut -f1 -d' ')
$date
您以命令的形式执行 in 中的任何内容,并将其输出通过管道传输到cut
.
我想你想要
month=$( printf '%s\n' "$date" | cut -f 1 -d ' ' )
这里。
另外,不要$(...)
在同一个脚本中混合使用反引号,这会造成混乱。就用$(...)
代替吧。
比较字符串是通过以下方式完成的=
:
if [ "$month" = "April" ]; then
请务必用双引号引用您的变量。看忘记在 bash/POSIX shell 中引用变量的安全隐患
可以使用 完成整数算术$(( expression ))
。 expr
已经过时了。
j1=$(( "$1" ))
j2=$(( "$2" ))
...
j1=$(( j1 + 1 ))