1. 程式人生 > >shell 中的 eval 及 crontab 命令

shell 中的 eval 及 crontab 命令

eval

eval會對後面的命令進行兩遍掃描,如果第一遍掃描後,命令是個普通命令,則執行此命令;如果命令中含有變數的間接引用,則保證間接引用的語義。也就是說,eval命令將會首先掃描命令列進行所有的置換,然後再執行該命令。因此,eval命令適用於那些一次掃描無法實現其功能的變數。

eval 執行以下兩個步驟

  • 第一次,執行變數替換,類似與C語言的巨集替代
  • 第二次,執行替換後的命令串

栗子:

1.  有一個名為test的檔案,其內容為“Please move on !”,定義一個內容是cat test的字串變數,利用echo 命令引用該變數, 則直接列印該字串,而用eval  則會輸出檔案test的內容!

這是由於執行eval命令第一次掃描進行了變數置換,第二次掃描執行了該字串所包含的命令cat test。

2.取得傳給shell指令碼的最後一個引數

  如果我們知道傳遞給shell的引數個數,想要輸出最後一個引數,可以使用echo直接顯示,例如,本例中輸入的引數有10、11、12共三個引數,可以使用命令: echo $3

  但是如果我們不知道有幾個引數,卻想輸出最後一個引數,大家可能會想到使用 $$# ( $# 為傳給shell指令碼的引數個數)來輸出最後一個引數。

  如果使用命令: echo "\$$#"  得到的結果是 $3,而不是我們想要的12。

  使用eval命令就可以達到我們的預期:  eval echo "\$$#"    則得到的結果為12。

shell指令碼內容:

 

執行指令碼檔案:

3.再比如:

[[email protected] test]$ G='|'
[[email protected] test]$ eval ls $G wc -l

第一步變數替換為 eval ls | wc -l  第二部再執行命令結果  

注意:

  1. eval 不能獲得函式處理結果 
  2. eval 巢狀無意義 ,在其他語言中可以通過 eval(eval("code")) ,來執行(執行動態生成的 code 的返回),而由於shell 中 eval 將後面的 eval 命令簡單當作命令字串執行,失去了巢狀作用,巢狀被命令替換取代。

crontab

  crond是linux下用來週期性的執行某種任務或等待處理某些事件的一個守護程序,系統會自動啟動crond程序,crond程序每分鐘會定期檢查是否有要執行的任務,如果有要執行的任務,則自動執行該任務。

  crontab檔案包含送交cron守護程序的一系列作業和指令。每個使用者可以擁有自己的crontab檔案;同時,作業系統儲存一個針對整個系統的crontab檔案,該檔案通常存放於/etc或者/etc之下的子目錄中,而這個檔案只能由系統管理員來修改。

  crontab命令用於設定系統週期性被執行的指令。該命令從標準輸入裝置讀取指令,並將其存放於“crontab”檔案中,以供之後讀取和執行。/etc/crontab檔案就是系統任務排程的配置檔案。

引數:

 -l 在標準輸出上顯示當前的crontab。 

 -r 刪除當前的crontab檔案。 

 -e 使用VISUAL或者EDITOR環境變數所指的編輯器編輯當前的crontab檔案

 使用格式 :
  *      *   *   *   *  command
  分   時  日  月  周   命令

  第1列表示分鐘0~59 (每分鐘用*或者 */1表示)
  第2列表示小時0~23
  第3列表示日期1~31 
  第4列表示月份1~12 
  第5列標識號星期0~6(0表示星期天) 
  第6列表示需要執行的命令 

除了數字還有幾個個特殊的符號就是"*"、"/"和"-"、",",*代表所有的取值範圍內的數字。"/"代表每的意思,"/5"表示每5個單位,"-"代表從某個數字到某個數字,","分開幾個離散的數字。

crontab檔案的一些使用例子:

#每晚的21:30 重啟apache
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
#每月1、10、22日的4 : 45重啟apache
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
#每週六、週日的1 : 10重啟apache
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
#每天18 : 00至23 : 00之間每隔30分鐘重啟apache
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
#每星期六的11 : 00 pm重啟apache
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
#晚上11點到早上7點之間,每隔一小時重啟apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
#每一小時重啟apache
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
#每月的4號與每週一到週三的11點重啟apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
#一月一號的4點重啟apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
#每半小時同步一下時間
*/30 * * * * /usr/sbin/ntpdate 210.72.145.44

相關推薦

shell eval crontab 命令

eval eval會對後面的命令進行兩遍掃描,如果第一遍掃描後,命令是個普通命令,則執行此命令;如果命令中含有變數的間接引用,則保證間接引用的語義。也就是說,eval命令將會首先掃描命令列進行所有的置換,然後再執行該命令。因此,eval命令適用於那些一次掃描無法實現其功能的變數。 eval 執行以下兩個步

shell exec 和 source 命令解析

mage 開始 概念 繼續 uil target 緩沖區 mman bash內部命令 文章大部分來源於:http://www.cnblogs.com/zhaoyl/archive/2012/07/07/2580749.html 作為筆記留存博客備忘。 exec和source

shell執行多個命令的方法

shell中執行多個命令的方法 1、在命令列中同時輸入多個語句: 直接在linux命令列中可以依次執行多個命令,多個命令間可採用“;”、“&&”和"||"分割,三個分隔符作用不同: (1);分割符:前後命令間沒有必然的聯絡,前一個執行結束後、再執行第二個,沒有邏輯關聯;

shell如何判斷某個命令是否存在

首先要說明的是,不要使用which來進行判斷,理由如下: 1.which非SHELL的內建命令,(用type來判斷某個命令是否為內建命令。)用起來比內建命令的開銷大,並且非內建命令會依賴平臺的實現,不同平臺的實現可能不同。 2.很多系統的which並不設定退出時的返回值,

jenkins通過Execute shell通過scp/ssh命令,將一臺機器專案遠端拷貝到另外一臺機器,修改檔案內容

1、前置條件 安裝expect yum install expect -y 2、在Execute shell中編寫如下命令 在jenkins中執行以下命令的時候,前提條件是現在jenki

Linux執行shell指令碼方式區別&命令後臺執行

假設shell指令碼檔案為hello.sh 放在/root目錄下。下面介紹幾種在終端執行shell指令碼的方法: [[email protected] home]# cd /root/ [[email protected] ~]#vim hello.s

adb shell 直接啟用介面命令

adb root adb remount adb shell am start -a android.settings.WIFI_SETTINGS am:activityManager  -a: ac

shell執行一個字串命令的方法

先來寫正確的方法 cmd="echo hello word" $cmd 或者eval $cmd。實際我測試的時候略有差別。比如執行‘ls -l’命令的時候,沒有eval得到的就沒有顏色。有了eval就有顏色。跟自己敲入命令的執行結果是一樣的。這個我不知道為什麼。盼高手來解答。

SHELL基本知識常用命令

一、shell基本知識 1. 什麼是shell shell shell也是作業系統中的一個軟體,它包在 linux 核心的外面,為使用者和核心之間的互動提供了一個介面,系統中的命令用 shell 去解釋 shell 接收系統迴應的輸出並

shell呼叫redis相關命令

##場景,研發同事要幫忙提供redis某個庫中的所有key和value的對應關係,一個db中 key有好多,手動來肯定會哭的!想到指令碼了! shell下檢視Reids的db10中所有key和value的對應: [[email protected] ~]# cat

在adb shell直接使用sqlite3命令操作資料庫

在開發easyEnglishLearning的過程中,我使用到了資料庫。在這裡我已經在外部建立好了資料庫,資料庫中存放了1000個常用的英文單詞。在APP中首先要讀取外部的資料庫,然後存放到程式目錄下,路徑為/data/data/com.example.feng

awk命令之 - 統計/etc/passwd文件各用戶所使用的shell類型出現次數

linux 命令 awk 統計/etc/passwd文件中各用戶所使用的shell類型及出現次數awk -F: ‘BEGIN{printf"%-15s\t%s\n","ShellType","Count"}{shellType[$NF]++}END{for(i in shellType)print

shellgrep命令常用語法

【背景】 grep的全稱是global regular expression print,是linux中最強大的文字搜尋命令之一,常用於搜尋文字檔案中是否含有某些特定模式的字串。該命令以行為單位讀取文字並使用正則表示式進行匹配,匹配成功後打印出該行文字。 【命令格式】 grep [opt

shell區域性變數local命令

http://blog.csdn.net/wangjianno2/article/details/50200617 感謝 shell中區域性變數及local命令 local一般用於區域性變數宣告,多在在函式內部使用。 (1)shell指令碼中定義的變數是global的,其作用

shell常見引數判斷命令

Shell常用特殊變數 經常會在shell命令中,看到$0, $#, $*, [email protected], $?, $$這樣的取值,這些代表什麼呢? 變數 含義

shell反引號和$()的區別以及eval命令

反引號和$()的區別 反引號和$()都是shell指令碼中用來進行命令代換的命令,命令代換就是執行一個命令將其結果交給一個變數。 echo ‘echo \\ ’ //反引號

Shell指令碼(三)-Shell的變數、函式read命令

在Shell指令碼中,通常需要在Shell命令使用其他資料來處理資訊。這就需要使用變數來實現,變數可以將資訊臨時儲存在Shell執行環境中,以便和指令碼中的其他命令一起使用。變數的型別系統變數:系統變數通常寫在/etc/profile或/etc/profile.d中,對所有使

linux shelleval , ` ` , $() 命令

1.倒引號與 $()的用法 倒引號括起來的是一條命令,shell應該先執行該命令,然後將輸出結果立刻代換到當前命令行中,命令代換也可以用$() 測試用例 執行結果 上述測試用例都是先執行倒引號與$()裡面的命令,然後再執行echo命令 2.“(

Pytohn實現Linux shell的wc命令

python wc #!/usr/bin/python import sys import os from optparse import OptionParser def opt(): parser = OptionParser() parser.add_option("-c

$.ajaxevaldataType

ucc jquery image data ges 技術 獲取數據 ajax 簡單的 一個簡單的ajax獲取數據可能會這樣寫:$.ajax({ type: "GET", url: url, data: {}, success: function (e