最終的な目標は、変数YYYYMMDDを設定することです。ここで、DDは2つの変数(01または16)のうちの1つです。
2つの値のいずれかで変数を作成しようとしています。
これが私が今まで持っているものですが、うまくいきません。
DYA=date +%d
DYB=IF [["$DYA" -ge 16]]; then 16
else 01
fi
YR=2020
MO=03
FD="$YR$MO$DY"
ECHO "$FD"
ベストアンサー1
bash
バージョン 4.2 以降の使用:
#!/bin/bash
printf -v day '%(%e)T' -1
if [[ $day -lt 16 ]]; then
# 1st half of the month
day=01
else
# 2nd half of the month
day=16
fi
printf '%(%Y%m)T%s\n' -1 "$day"
最初は、printf
今月の日付を10進数で変数に印刷しますday
。これらのif
文は、その値に制限されるか、01
その16
値によって制限されます。
最後に、printf
現在の年と月を印刷してから、最後に01
or文字列を追加します。16
-1
呼び出しの引数は、フォーマットprintf
文字%(...)T
列が現在の時刻をフォーマットされたタイムスタンプとして使用するようにします(bash
4.3以降を使用している場合、最初の呼び出しは暗黙的であるため、厳密には要求されません)。
よりコンパクトなバージョンbash
:
#!/bin/bash
printf -v day '%(%e)T' -1
printf '%(%Y%m)T%.2d\n' -1 "$(( (day < 16) ? 1 : 16 ))"
ここでは、公開関数を使用して算術拡張テストを実行します。三項演算子 ?:
。 16より小さい1
場合は$day
結果は文字列、16
16より大きい場合は結果は文字列です。算術拡張の結果は、ゼロで埋められた整数形式で指定され、現在の年と月の後に挿入されます。
あなたのコードに関して:
- そして
[[ ... ]]
両側にスペースが必要であることに注意してください(まあ、コマンドターミネーターなので、スペースなしですぐに表示されることがあります)。[[
]]
;
date
コマンドの出力を変数に入れるには、コマンド置換を使用しますday=$( date +%e )
。if
これは、値を出力するものであれば、あなたのステートメントに当てはまります(ただしそうではありません)。- Unixコマンドは大文字と小文字を区別するので、
ECHO
おそらくecho
。 - 時間形式の出力と
%d
。算術コンテキスト(文)でこれらの値を使用すると、値は次のように解釈されます。01
31
if
01
07
8進数値を入力すると、08
合計エラーが発生します09
(無効な8進数)。だから私は%e
との間にゼロ以外のパディングされた整数を取得するために使用します。1
31
最後のポイントについて:私も利用可能です
printf -v day '%(%d)T' -1
01
との間にゼロパディング値を取得するには、31
以下を使用する必要があります。
if [[ 10#$day -ge 16 ]]; then
シェルが文字列を8進整数の代わりに10進整数として解釈するように強制します。
/bin/sh
スクリプトとして(bash
4.2以前のバージョンでも動作します(例:bash
macOSのデフォルトシェル):
#!/bin/sh
day=$( date +%e )
if [ "$day" -lt 16 ]; then
# 1st half of the month
day=01
else
# 2nd half of the month
day=16
fi
date +"%Y%m$day"
標準シェルにはフォーマット文字列がsh
ないため、日付文字列形式を使用する必要があります。代わりにテストにも使用されます(そして変数は二重引用符で囲む必要があります)。%(...)T
bash
date
[ ... ]
[[ ... ]]
よりコンパクトなバージョン/bin/sh
:
#!/bin/sh
day=$( date +%e )
printf '%s%.2d\n' "$(date +%Y%m)" "$(( (day < 16) ? 1 : 16 ))"
このよりコンパクトなバージョンは、コンパクトなbash
変形から派生しました。唯一の違いは、date
現在の年と月の形式を指定することです。