當前位置:首頁 » 網頁前端 » shell腳本查詢當月的天數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

shell腳本查詢當月的天數

發布時間: 2022-05-15 07:36:31

1. 如何在SHELL獲取當天時間的月份和上個月的月份還有下個月的月份

上個月比較好寫,減去當前日期,再減1天
# date -d "-1 days" -d "-`date +%d` days" +%m
09
------------------------------------------------------------
下個月就不好寫咯
date里的1 month有問題
比如今天是10月31日
# date -d "1 month" +%m
12
變成12月了

# date +%m
10
獲取當前月份

那麼下個月只好寫代碼了:
now_month=`date +%m`
if [ $now_month -ne 12 ];then
echo nextmonth is `expr $now_month + 1`

else
echo nextmonth is 01

fi

2. shell腳本中如何取上個月比如現在201606,顯示201605,試了多種都是顯示當前

3. shell腳本計算時間

TIME_INPUT=`date -d "00:00" +%s`
通過時間戳來計算
nowtime=`date +%s`
shijiancha=`expr $nowtime - $TIME_INPUT`
if [ $shijiancha -gt 180 ];then
echo 3分鍾前

else
if [ $shijiancha -lt -180 ];then

echo 3分鍾後

fi

fi

4. 用shell腳本讀取一個包含當前時間的文件,該文件的格式必須為第一行月,日,年,

先把當前時間寫入該文件啊

命令:echo `date +"%Y-%m-%d %T"` >abc.txt
期中abc.txt是你的文件
此命令的結果:2015-12-17 09:09:25
再把順序截取一下月日年

5. shell鍵盤獲取一個日期,可查詢其前N天後N天!!要求,不是用date自帶的命令方法,考慮平年閏年跨年跨月

最近努力學習新知識,在公司內網上閱讀一些優秀文章,但是發現這些文章:是通過通過flash控制項展示,並且不提供無法下載地址(類似《網路文庫》)。一次忍了,兩次再忍了,三次就無法忍受:都在我電腦上展示了,這么做就是惡心人了。。。。
於是花了大半天時間,使用mac上自帶軟體Automator,從零開始完成了自己的工具:《連續抓圖導出PDF》。

實現原理:自動截屏、翻頁=》merge生成PDF文檔。(感興趣的人,可以下載附件看看源碼)

在寫這個腳本過程中,本以為會很快,但是還是碰到了不少問題;於是就記錄並分享出來。

首先:最基本用法,可以直接參考Automator幫助,本文章只寫自認為容易忽略或者難點的幾個地方。

變數使用

變數新建就不說了;這里主要說變數再控制項上使用,幾種方法(有的方法只對部分控制項有用):

從下拉列表直接選擇「變數」

將「變數」拖進區域


當然你也可以,拋棄使用已存在的變數,直接通過下拉框選擇一個「新建變數」。

「輸入變數名」彈出提示,「回車」選擇

最後,如果上面三種方法你嘗試都不行的話,基本上可以宣告,那個是不支持變數的。
比如,LOOP的「次數」,是不支持變數的:

腳本

腳本使用

Automator腳本支持:shell腳本(bash、perl、python、ruby等)、appleScript、javascript幾種,你可以選擇不同的腳本來運行。

腳本參數傳遞

腳本和變數之間,是無法直接獲取或設置的

「變數」值傳遞到腳本

– shell腳本

獲取到的輸入:只能是通過輸入的一行一行的字元串
也即如果,想獲取變數值的話,可以通過,「獲得變數的值」控制項來輸出值,然後傳遞到腳本然後再讀取。
如:下面是獲取「頁數」、「URL」、「臨時文件夾」三個變數值到輸出,然後傳遞給perl腳本。1234

– AppleScript腳本

AppleScript的輸入不是一行一行的字元串,貌似是鍵值隊(還不熟悉這塊),結果沒搞懂如何傳遞的變數——搞懂後,再補充。
於是我考慮的解決方案是:通過分隔符「|」將輸入的多行轉換成一行,然後在AppleScript進行反轉。的確是有些trick -_-!——不過後來查資料發現,也有人這么整。123


perl代碼:

@input = ();while (<>) { $_=~s/(^s*)|(s*$)//g; push(@input,$_);
}print join "|" ,@input;123456

AppleScript代碼:

on run input set myArray to my theSplit((item 1 of input) as string, "|") set outputPath to item 1 of myArray set pagenum to item 2 of myArray as number
set myurl to item 3 of myArray set tempDir to item 4 of myArray
return myArrayend runon theSplit(theString, theDelimiter) -- save delimiters to restore old settings
set oldDelimiters to AppleScript's text item delimiters

-- set delimiters to delimiter to be used
set AppleScript's text item delimiters to theDelimiter -- create the array
--set theArray to every text item of theString
set theArray to text items of theString -- restore the old setting
set AppleScript's text item delimiters to oldDelimiters -- return the result return theArrayend

腳本結果,設置到「變數」中

腳本中的變數,是無法設置到腳本中,怎麼辦呢?其也只能通過腳本輸出結果,然後「設定變數的值」控制項,對變數進行設置。
- - 設置一個變數

注意:這里有一個問題,如果腳本輸出的是多行,其實只把第一行字元串,賦值到「變數」中

  • 設置多個變數

  • 但是如果要設置多個變數值,咋辦?
    於是又是一個trick方法來了,利用上面「只會把第一行賦值給變數」的機制,通過「漏斗」方式逐個對變數進行賦值:

    如上圖,依次對「導出路徑」、「頁數」等多個變數進行逐個復制。
    其中perl代碼作用是:過濾第一行字元串:

  • $count=0;while(<>){ print $_ if $count >0 ;

  • $count = $count + 1 ;

  • }12345

  • 鍵盤錄制&滑鼠錄制

    Automator提供「錄制」功能,位於右上角:

    注意如果你使用錄制功能,需要mac再偏好設置里,設置一下「允許Automator控制你的電腦」,這樣在運行時才有用:

    但是實際操作起來,我碰到了下面兩個問題:

    1、滑鼠錄制,總是不準
    2、鍵盤錄制,則永遠也沒有錄制上去

    第一個問題,我沒有找到很好辦法;最後沒有使用;
    第二個問題,不是錄入,而是寫代碼,通過appleScript來實現:

    鍵盤操作


    腳本代碼是:

  • on run {input, parameters} --

  • set timeoutSeconds to 0

  • set uiScript to "keystroke "a" " --標注,注意這行代碼

  • my doWithTimeout(uiScript, timeoutSeconds) return inputend runon doWithTimeout(uiScript, timeoutSeconds) set endDate to (current date) + timeoutSeconds repeat

  • try

  • run script "tell application "System Events"

  • " & uiScript & "

  • end tell"

  • exit repeat

  • on error errorMessage if ((current date) > endDate) then

  • error "Can not " & uiScript end if

  • end try

  • end repeatend

  • 接下來,看看鍵盤操作(均是修改,標注的那一行)幾種情況解決方案:

    普通字元

    普通字元,比較簡單,使用keystroke ,輸入字元就可以,比如輸入」a」字元:

  • set uiScript to "keystroke "a" "1

  • 特殊字元

    對於一些特殊字元,沒有特殊ASCII碼,比如:上、下、左、右鍵。因此可以考慮另外一個通過「鍵值」(即操作系統對按鍵的虛擬值)來實現,key code :

    比如:「右」按鍵的代碼是:

  • set uiScript to "key code 124 "1

  • 當然,key code 也可以輸入普通字元,如:
    「a」 按鍵代碼是:

  • set uiScript to "key code 0 "1

  • 「A」按鍵代碼是:

  • set uiScript to "key code 0 using {shift down} "1

  • mac系統的虛擬鍵值,可以通過終端命令執行下面命令查詢到:

  • $ grep '^ *kVK' /System/Library/Frameworks/Carbon.framework/Versions/A/Frameworks/HIToolbox.framework/Versions/A/Headers/Events.h|tr -d ,|while read x y z;do printf '%d %s %s ' $z $z ${x#kVK_};done|sort -n1

  • 或者你直接查下「附1-key code 表」也行:

    組合鍵

    上兩個方法,都可以配合組合鍵進行使用:

  • set uiScript to "key code 124 using {control down, option down, command down,shift down}" --control+option+command+right+shift1

  • 循環

    Automator對於系列處理動作的流程,製作非常簡單,僅僅需要拖拽基本就可以實現。
    但是在分支、循環等這種邏輯上,處理起來要復雜很多。 基本稍微復雜一點的都需要腳本配合才可以的。

    簡單循環

    Automator只提供了簡單的「Loop」循環控制項,這個循環控制項可控執行很差,因為:

  • 只能從腳本開頭循環

  • 循環策略支持:
    A)次數/時間,但是無法通過變數控制
    B)詢問方式
    試想一下,你就是需要從中間塊循環,但是他非要從開頭開始,你是無法選擇的,這是個多麼想哭的事情。

  • 復雜循環

    那麼對於復雜的循環怎麼處理?
    Automator支持workflow的調用,因此如果你需要循環的話一種解決方案就是:將需要循環塊的部分,寫成workflow1,然後再主workflow通過腳本控制workflow1的循環。

    workflow開始准備工作調用workflow1是否結束?結束yesno

    注意:新建workflow1時,選擇「工組流程」:

    這里實現主要有兩個問題:
    1、workflow之間的變數是無法共享的(至少現在我發現是這樣的)。它也只能想字元串一樣傳遞。
    但是這個問題:上面腳本使用一節中的「多變數的賦值」方法可以解決。

    2、如何腳本調用,workflow?
    通過 do shell script cmd,進行執行cmd命令調用,但是這里有一個問題就是:命令執行是不等待結束立即返回的(實現方法是新起進程執行)——目前還沒有找到能夠等待返回的方法。

  • on run input set myArray to my theSplit((item 1 of input) as string, "|") set outputPath to item 1 of myArray set pagenum to item 2 of myArray as number

  • set myurl to item 3 of myArray set tempDir to item 4 of myArray delay 10

  • set mycount to 1000 as number

  • repeat

  • run_workflow(tempDir & "/" & (mycount) & ".pdf", "/Users/xxxx/Desktop/test2/自動截頻.workflow") if pagenum ≤ 1 then

  • exit repeat

  • end if

  • set pagenum to pagenum - 1

  • set mycount to mycount + 1


  • --按下右鍵

  • set timeoutSeconds to 2

  • set uiScript to "keystroke (ASCII character 29) "

  • my doWithTimeout(uiScript, timeoutSeconds) end repeat

  • delay 1 return myArrayend run--執行workflowon run_workflow(inputVars, workflowPath) set {tid, AppleScript's text item delimiters} to {AppleScript's text item delimiters, linefeed} set theInputsList to inputVars as text

  • set AppleScript's text item delimiters to tid set cmd to "automator -i '" & theInputsList & "' " & workflowPath return do shell script cmdend run_workflowon theSplit(theString, theDelimiter) -- save delimiters to restore old settings

  • set oldDelimiters to AppleScript's text item delimiters


  • -- set delimiters to delimiter to be used

  • set AppleScript's text item delimiters to theDelimiter -- create the array

  • --set theArray to every text item of theString

  • set theArray to text items of theString -- restore the old setting

  • set AppleScript's text item delimiters to oldDelimiters -- return the result return theArrayend theSpliton doWithTimeout(uiScript, timeoutSeconds) set endDate to (current date) + timeoutSeconds repeat

  • try

  • run script "tell application "System Events"

  • " & uiScript & "

  • end tell"

  • exit repeat

  • on error errorMessage if ((current date) > endDate) then

  • error "Can not " & uiScript end if

  • end try

  • end repeatend 2425262728293031323369

  • 附1-key code 表

    十進制

    十六進制

    按鍵

    0 0x00 ANSI_A

    1 0x01 ANSI_S

    2 0x02 ANSI_D

    3 0x03 ANSI_F

    4 0x04 ANSI_H

    5 0x05 ANSI_G

    6 0x06 ANSI_Z

    7 0x07 ANSI_X

    8 0x08 ANSI_C

    9 0x09 ANSI_V

    10 0x0A ISO_Section

    11 0x0B ANSI_B

    12 0x0C ANSI_Q

    13 0x0D ANSI_W

    14 0x0E ANSI_E

    15 0x0F ANSI_R

    16 0x10 ANSI_Y

    17 0x11 ANSI_T

    18 0x12 ANSI_1

    19 0x13 ANSI_2

    20 0x14 ANSI_3

    21 0x15 ANSI_4

    22 0x16 ANSI_6

    23 0x17 ANSI_5

    24 0x18 ANSI_Equal

    25 0x19 ANSI_9

    26 0x1A ANSI_7

    27 0x1B ANSI_Minus

    28 0x1C ANSI_8

    29 0x1D ANSI_0

    30 0x1E ANSI_RightBracket

    31 0x1F ANSI_O

    32 0x20 ANSI_U

    33 0x21 ANSI_LeftBracket

    34 0x22 ANSI_I

    35 0x23 ANSI_P

    36 0x24 Return

    37 0x25 ANSI_L

    38 0x26 ANSI_J

    39 0x27 ANSI_Quote

    40 0x28 ANSI_K

    41 0x29 ANSI_Semicolon

    42 0x2A ANSI_Backslash

    43 0x2B ANSI_Comma

    44 0x2C ANSI_Slash

    45 0x2D ANSI_N

    46 0x2E ANSI_M

    47 0x2F ANSI_Period

    48 0x30 Tab

    49 0x31 Space

    50 0x32 ANSI_Grave

    51 0x33 Delete

    53 0x35 Escape

    55 0x37 Command

    56 0x38 Shift

    57 0x39 CapsLock

    58 0x3A Option

    59 0x3B Control

    60 0x3C RightShift

    61 0x3D RightOption

    62 0x3E RightControl

    63 0x3F Function

    64 0x40 F17

    65 0x41 ANSI_KeypadDecimal

    67 0x43 ANSI_KeypadMultiply

    69 0x45 ANSI_KeypadPlus

    71 0x47 ANSI_KeypadClear

    72 0x48 VolumeUp

    73 0x49 VolumeDown

    74 0x4A Mute

    75 0x4B ANSI_KeypadDivide

    76 0x4C ANSI_KeypadEnter

    78 0x4E ANSI_KeypadMinus

    79 0x4F F18

    80 0x50 F19

    81 0x51 ANSI_KeypadEquals

    82 0x52 ANSI_Keypad0

    83 0x53 ANSI_Keypad1

    84 0x54 ANSI_Keypad2

    85 0x55 ANSI_Keypad3

    86 0x56 ANSI_Keypad4

    87 0x57 ANSI_Keypad5

    88 0x58 ANSI_Keypad6

    89 0x59 ANSI_Keypad7

    90 0x5A F20

    91 0x5B ANSI_Keypad8

    92 0x5C ANSI_Keypad9

    93 0x5D JIS_Yen

    94 0x5E JIS_Underscore

    95 0x5F JIS_KeypadComma

    96 0x60 F5

    97 0x61 F6

    98 0x62 F7

    99 0x63 F3

    100 0x64 F8

    101 0x65 F9

    102 0x66 JIS_Eisu

    103 0x67 F11

    104 0x68 JIS_Kana

    105 0x69 F13

    106 0x6A F16

    107 0x6B F14

    109 0x6D F10

    111 0x6F F12

    113 0x71 F15

    114 0x72 Help

    115 0x73 Home

    116 0x74 PageUp

    117 0x75 ForwardDelete

    118 0x76 F4

    119 0x77 End

    120 0x78 F2

    121 0x79 PageDown

    122 0x7A F1

    123 0x7B LeftArrow

    124 0x7C RightArrow

    125 0x7D DownArrow

    126 0x7E UpArrow

6. 請教如何在shell腳本中得到系統當前時間

在shell腳本里常常需要獲取系統時間來處理某項操作,今天系統的學習了一下如何獲取系統時間。記錄如下:
linux的系統時間在shell里是可以直接調用系統變數的如:
獲取今天時期:`date +%Y%m%d` 或 `date +%F` 或 $(date +%y%m%d)
命令輸出結果如下:
[root@centi-C sh]# date +%Y%m%d
20120727
[root@centi-C sh]# date +%F
2012-07-27
[root@centi-C sh]# date +%y%m%d
120727

獲取昨天時期:`date -d yesterday +%Y%m%d` 也可以寫成`date -d -1day +%Y%m%d`
[root@centi-C sh]# date -d yesterday +%Y%m%d
20120726
[root@centi-C sh]# date -d yesterday +%F
2012-07-26
[root@centi-C sh]# date -d -1day +%y%m%d
120726
[root@centi-C sh]# date -d -1day +%Y%m%d
20120726

獲取前天日期:`date -d -2day +%Y%m%d`
依次類推比如獲取10天前的日期:`date -d -10day +%Y%m%d`
或n天前的 `date -d "n days ago" +%y%m%d`
明天:`date -d tomorrow +%y%m%d`
注意以上中間有空格

至於你需要什麼樣的日期時間格式,就需要應用相關的時間域參數來實現咯
相關時間域如下:
% H 小時(00..23)
% I 小時(01..12)
% k 小時(0..23)
% l 小時(1..12)
% M 分(00..59)
% p 顯示出AM或PM
% r 時間(hh:mm:ss AM或PM),12小時
% s 從1970年1月1日00:00:00到目前經歷的秒數
% S 秒(00..59)
% T 時間(24小時制)(hh:mm:ss)
% X 顯示時間的格式(%H:%M:%S)
% Z 時區 日期域
% a 星期幾的簡稱( Sun..Sat)
% A 星期幾的全稱( Sunday..Saturday)
% b 月的簡稱(Jan..Dec)
% B 月的全稱(January..December)
% c 日期和時間( Mon Nov 8 14:12:46 CST 1999)
% d 一個月的第幾天(01..31)
% D 日期(mm/dd/yy)
% h 和%b選項相同
% j 一年的第幾天(001..366)
% m 月(01..12)
% w 一個星期的第幾天(0代表星期天)
% W 一年的第幾個星期(00..53,星期一為第一天)
% x 顯示日期的格式(mm/dd/yy)
% y 年的最後兩個數字( 1999則是99)
% Y 年(例如:1970,1996等)
注意:只有超級用戶才有許可權使用date命令設置時間,一般用戶只能使用date命令顯示時間。
添加一個練習腳本,功能:
在每月第一天備份並壓縮/etc目錄的所有內容,存放在/root/bak目錄里,且文件名為如下形式yymmdd_etc,yy為年,mm為月,dd為日。Shell程序fileback存放在/usr/bin目錄下。
#/bin/bash
#filebak
#file executable: chmod 755 filebak
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
bakdir="/root/bak/"
filename="`date +%y%m%d`_etc.tar.gz"
if [ ! -x "$bakdir" ];then
mkdir $bakdir
fi
cd $bakdir
tar cvfz $filename /etc
或使用crontab -e 命令添加定時任務:
0 1 * * * /bin/sh /usr/bin/fileback

7. shell 如何判讀當前日期是否是,當月的第一天

用一個簡單腳本判斷日期是否是1號即可,腳本如下:
#!/bin/bash
#取得今天的日
DAY=`date +%d`
#判斷是否為1號
if [ "$DAY" = 01 ];
then
echo yes
else
echo no
fi

8. linux中,怎麼通過shell語句獲取當前日期,輸出格式要求20111224.

獲得當天的日期:date +%Y%m%d,輸出: 20181130。

需要使用今天之前或者往後的日期,這時可以使用date的 -d參數:

1、獲取明天的日期:date -d next-day +%Y%m%d。

2、獲取昨天的日期:date -d last-day +%Y%m%d。

3、獲取上個月的年和月:date -d last-month +%Y%m。

4、獲取下個月的年和月:date -d next-month +%Y%m。

5、獲取明年的年份:date -d next-year +%Y。

(8)shell腳本查詢當月的天數擴展閱讀

linux的系統時間在shell里是可以直接調用系統變數的如:

獲取今天時期:`date +%Y%m%d` 或 `date +%F` 或 $(date +%y%m%d)

命令輸出結果如下:

[root@centi-C sh]# date +%Y%m%d

20120727

[root@centi-C sh]# date +%F

2012-07-27

[root@centi-C sh]# date +%y%m%d

120727