1

私もです:

expr `date +%d` - 1

sh シェルでは、正しく応答し11ます。

しかし、それを変数に格納したい場合:

-sh-4.2# NUMBER=expr `date +%d` - 1
-sh: 12: command not found
-sh-4.2# NUMBER=$((expr `date +%d` - 1))
-sh: expr 12 - 1: syntax error in expression (error token is "12 - 1")
-sh-4.2# NUMBER="expr `date +%d` - 1" 
-sh-4.2# echo $NUMBER
expr 12 - 1
-sh-4.2# $NUMBER
11
-sh-4.2# 

それは私が探しているものを私に与えてくれません。私が欲しい:

$NUMBER をエコー

1111に評価しないと言うのですか?

私の質問は次のとおりです。

  1. 最初の試行がうまくいかないのはなぜですか?
  2. どうすれば実現できますか?

ところで、私は /bin/sh GNU bash、バージョン 4.2.10(1)-release (mipsel-unknown-linux-uclibc) に限定されています。

編集: そして、日付は非常に限られています。BusyBox v1.19.4 (2013-10-30 00:56:51 PDT) マルチコール バイナリ。 /編集

ただし、bash は組み込みプラットフォームであるため制限があります。

4

3 に答える 3

4

これがあなたが探しているものだと思います:

$ NUMBER=$(expr `date +%d` - 1)
$ エコー $NUMBER
11
$

expr は評価されるコマンドであるため、これは機能します。評価されたコマンドの出力を取得するには、$() コマンド展開またはバッククォートを使用できます

または

$ NUMBER=$(expr $(date +%d) - 1)
$ エコー $NUMBER
11
$

これは最初の例とほとんど同じです。Note$()は、引用符をエスケープせずに簡単にネストできるため、バッククォートよりも適しています。

または

$ NUMBER=$(($(date +%d) - 1))
$ エコー $NUMBER
11
$

$(( ))算術展開を使用して、 expr コマンドを使用せずにシェルで直接算術を行うこともできます。Advanced Bash-Scripting Guideの算術展開セクションを参照してください。


アップデート

busybox を使用しているため、月の 1 日であっても、この一口を使用して日付の計算を正しく行うことができます。

$型日付
日付は「busybox date」にエイリアスされます
$ NUMBER=$(日付 -D %s -d $(($(日付 +%s) - 86400)) +%d)
$ エコー $NUMBER
11
$

これは 2038 年に壊れますが、Unix Epoch Year 2038 問題により、これを原子力発電所や宇宙ステーションなどに実装しないでください ;-)

于 2013-11-12T15:41:37.517 に答える
3

月の最初に、何の数値が必要ですか: 0 または前月の最後の日付?

代わりにこれが欲しいのだろうか:number=$(date -d yesterday +%d)


ここでは、busybox awk を使用します。

yesterday=$(
    busybox awk 'BEGIN {
        today = strftime("%Y %m %d", systime())
        split(today, ymd)
        yesterday = ymd[1] " " ymd[2] " " (ymd[3]-1) " 0 0 0"
        print strftime("%d", mktime(yesterday))
    }'
)

awk の mktime は、0 日を前月の最終日として扱います。たとえば、2012 年 3 月 1 日の「昨日」は 2 月 29 日です。

$ busybox awk 'BEGIN {print strftime("%d", mktime("2012 03 00 0 0 0"))}'
29
于 2013-11-12T15:47:17.147 に答える
1

は必要ありませexpr$(( ... ))。数値計算も必要ありません。

代わりに次の構文を使用する必要があります。

NUMBER=$(( $(date +%e) - 1))

+%eの代わりに修飾子を使用したことに注意してください+%d。これにより、dateコマンドが先行ゼロを出力しないため、出力が 8 進数として解釈されてしまいます (Glenn Jackman の功績によるものです)。

于 2013-11-12T15:41:08.067 に答える