聯系我們 - 廣告服務 - 聯系電話:
您的當前位置: > 關注 > > 正文

常用的shell腳本 linux腳本之間的傳遞參數

來源:CSDN 時間:2023-02-03 14:53:40

1、腳本之間傳遞參數 "1.sh"的腳本,接受參數。如下,如果有一個參數則賦值個sourceFile這個變量,否則用默認值。

Shell代碼

#!/bin/bash


【資料圖】

LANG=en_US.UTF-8

#get parameters

sourceFile="/data/log/abc"

if [ $# == 1 ]

then sourceFile=$1

else echo "$1 required!"

fi

echo $sourceFile

備注:這里$#是傳遞參數的個數,$1 是具體的參數。 關于if else: 如果兩條命令寫在同一行則需要用";"號隔開,一行只寫一條命令就不需要寫";"號了。和[命令一樣,要注意命令和各參數之間必須用空格隔開。if命令的參數組成一條子命令,如果該子命令的Exit Status為0(表示真),則執行then后面的子命令,如果Exit Status非0(表示假),則執行elif、else或者fi后面的子命令。if后面的子命令通常是測試命令,但也可以是其它命令。Shell腳本沒有{}括號,所以用fi表示if語句塊的結束。 "2.sh"的腳本,傳遞參數

Shell代碼

#!/bin/bash

sh 1.sh 參數1 參數2 ...  

備注:多個參數之間用空格符隔開。 2、文件內容行之間的排序

Shell代碼

#!/bin/bash

sort -t= +4 文件 ”

備注:“=”表示按=號進行切割(注意:只能是單個字符),“+4”表示按第五個項進行排序。 更多參數: -r 表示降序排序 -n 表示按數字大小排序 -k 表示根據那個字段排序,4.1,表示第4列第一個字符開始 ,5表示到第5個字段為結束 -t 后面跟分隔符,缺省是空格 例如:sort -r -n -k4.1,5 3、判斷目錄是否存在,沒有則新建一個目錄

Shell代碼

#!/bin/bash

dayDir="/home/logs/"

if [ ! -d "$dayDir" ]

then mkdir "$dayDir" fi

4、判斷文件是否存在,有則刪除

Shell代碼

#!/bin/bash

if [ -f "$FAIL_FILE" ]

then

rm -rf "$FAIL_FILE"

echo `date`" FILE IS EXISTS: "$FAIL_FILE

fi

5、找出文件中的相關行

Shell代碼

#!/bin/bash

cat 文件 |grep -a "關鍵詞" >> result.log

備注:把文件中包含關鍵詞的行輸出到result.log中。 6、文件切分

Shell代碼

#!/bin/bash

awk -F"" "{print $1}" 文件

備注:“”表示分隔符,“print”表示換行輸出(printf不換行),“$1”表示取第一項?!拔募北硎疽蟹值奈募?7、文件內容排重

Shell代碼

#!/bin/bash

awk -F"," "!a[$1]++" test.txt

備注:“,”表示按“,”號分隔;“$1”表示按第一項排重;“test.txt”表示要處理的文件。 8、grep多個關鍵字

Shell代碼

#!/bin/bash

cat $file |grep -a "aop=keyword1\|keyword2"

備注:多個關鍵字用“\|”分隔。 9、時間格式化,中間有空格的需要加引號

Shell代碼

#!/bin/bash

TODAY=`date -d today "+%Y-%m-%d %H:%M:%S"`

10、多個文件合并

Shell代碼

#!/bin/bash

cat $FILE1 $FILE2 |grep -a "關鍵字" > $MERGE_FILE

11、運行java項目

Shell代碼

#!/bin/bash

LANG=en_US.UTF-8

export LANG=$LANG

/usr/java/latest/bin/java -cp . -Djava.ext.dirs=../lib 包.類(含main方法) -a 參數1 -b 參數2

備注:“/usr/java/latest/bin/java”表示Java環境,“-cp”表示classpath路徑,“.”表示當前目錄,“-Djava.ext.dirs”表示jar文件所在目錄,“-a”表示參數名稱,“參數1”表示參數值。 12、根據關鍵字統計行數,賦值給變量

Shell代碼

#!/bin/bash

COUNT=$(cat $FILE |grep -a "關鍵字" |wc -l)

備注:“$FILE”表示要統計的文件,“關鍵字”要包含的關鍵字,“wc”統計文件(-l行數,-w字數,-c字節數) wc命令的功能為統計指定文件中的字節數、字數、行數, 并將統計結果顯示輸出。 語法:wc [選項] 文件… 說明:該命令統計給定文件中的字節數、字數、行數。如果沒有給出文件名,則從標準輸入讀取。wc同時也給出所有指定文件的總統計數。字是由空格字符區分開的最大字符串。 該命令各選項含義如下: -c 統計字節數。 -l 統計行數。 -w 統計字數。 這些選項可以組合使用。 輸出列的順序和數目不受選項的順序和數目的影響。總是按下述順序顯示并且每項最多一列。 行數、字數、字節數、文件名 如果命令行中沒有文件名,則輸出中不出現文件名。 例如: $wc -lcw file1 file2 4 33 file1 7 52 file2 11 11 85 total 省略任選項-lcw,wc命令的執行結果與上面一樣。 13、基本算術計算的方法(5種) a.使用awk計算

Shell代碼

#!/bin/bash

##示例1:10和12為兩個參數分別對應$1和$2

echo 10 12 |awk "{printf("%d\n", $1+$2)}"

##示例2:a和b作為兩個變量傳入

a=10

b=12

echo |awk "{printf("%d\n", "$a"+"$b")}"  

##示例3:COUNT_FAIL除以COUNT_INIT 保留4為小數,結果賦值給FAIL_INIT,[b]結果四舍五入[/b]。

COUNT_FAIL=10

COUNT_INIT=20

FAIL_INIT=`awk "BEGIN{printf "%.4f\n","$COUNT_FAIL"/"$COUNT_INIT"}"`

echo $FAIL_INIT

備注:示例2和示例3兩種寫法除數和被除數都要加“"”號(單引號),否則會報錯“division by zero attempted”,另外“BEGIN”也很重要哦。 b.使用bc命令

Shell代碼

#!/bin/bash

##示例1:輸出 1+2 的運算結果

echo 1+2 |bc  

##示例2:COUNT_FAIL除以COUNT_INIT 保留2為小數,結果賦值給FAIL_INIT,[b]結果不四舍五入[/b]。

FAIL_INIT=`echo "scale=2; $COUNT_FAIL/$COUNT_INIT" | bc`

c.使用expr命令

Shell代碼

#!/bin/bash

count=10

count=`expr $count + 12`  

echo $count

d.使用let命令

Shell代碼

#!/bin/bash

##示例1

let num1=10*20  

echo $num1

##示例2

let "num2=10*20"

echo $num2

e.加雙括號

Shell代碼

#!/bin/bash

##示例1:雙小括號

a=12

b=20

echo $((a*b))  

echo $(($a*$b))

##示例2:中括號

c=10

echo $[c*20]

echo $[$c*20]

備注:此種寫法括號里面的變量可以不用加“$”符號,但是括號外面的“$”符號一定要加上。14、運用tee命令將日志同時輸出到多個文件 tee用法功能說明:讀取標準輸入的數據,并將其內容輸出成文件。 語 法:tee [-ai][--help][--version][文件...] 補充說明:tee指令會從標準輸入設備讀取數據,將其內容輸出到標準輸出設備,同時保存成文件。 參 數: -a或--append 附加到既有文件的后面,而非覆蓋它. -i或--ignore-interrupts 忽略中斷信號。 -help 在線幫助。 -version 顯示版本信息。 例1:日志在記入log1.txt和log2.txt的同時也在控制臺輸出

Shell代碼

#!/bin/bash

echo "hello jack!" |tee -a log1.txt log2.txt  

備注:“-a”追加,否則清空重寫。 15、針對某個域進行分組統計

Shell代碼

#!/bin/bash

cat $FILE |awk -F"" "{list[$11]++;}END{for (val in list) print val, list[val];}" |tee -a $RESULT_FILE

備注:“$FILE”要處理的文件,用awk命令按“”進行切分,“$11”表示第11域(1,3,5,...),“var”表示分組名稱,“list[var]”表示每組的數量。 16、查詢控制命令的歷史記錄

Shell代碼

#!/bin/bash history |grep "rm"

備注:查詢包含“rm”字符的命令記錄。 17、循環刪除所有文件

Shell代碼

#!/bin/bash

for i in `ls`; do rm $i; done

備注:在文件非常多的情況下,rm * 命令不能刪除所有文件。所以需要遍歷刪除每一個文件。 18、遍歷文件夾并按第二個域對文件內容排序。

Shell代碼

#!/bin/bash

#用等號分隔,按第二個域排序

function sortfile(){

echo "Processing: "$1 sort -t= +1 $1 > $1"_temp"

mv $1"_temp" $1

}

#遍歷文件夾,調用排序函數

function ergodic(){

for file in `ls $1`

do

if [ -d $1"/"$file ]

then

ergodic $1"/"$file

else

f=$1"/"$file

#調用排序函數

sortfile $f

fi

done

}

#以參數形式運行程序

if [ $# == 1 ];

then

echo "parameter: "$1;

ergodic $1

else

echo "a file directory required!"

fi

19、查看文件夾下所有文件數目和所有文件夾數目

Shell代碼

#!/bin/bash

#查看當前文件夾下所有文件數目

find . -type f |wc -l

#查看當前文件夾下所有文件夾數目

find . -type d |wc -l

備注:“.”表示當前目錄,可以換成其他路徑。 20、shell與java正則區別

Java代碼

String regex = "2010-11-08.+"

//或者 regex = "2010-11-08.*"

備注:JAVA中匹配以“2010-11-08"開頭的字符串。

Shell代碼

regex = "2010-11-08*"

備注:SHELL中匹配以“2010-11-08”開頭的字符串。 “.*”或“.+”在java中表示任意多個字符串,如果要匹配“.”號,需要加轉義“\”。 “*”在shell表示任意多個字符,加“.”或“+”號都會錯誤。 21、編碼轉換命令

Shell代碼

iconv -f gb2312 -t utf-8 a.log > b.log

備注:表示把a.log文件從gb2312編碼轉成utf-8的編碼,并把文件寫入b.log 22、批量替換多個文件中的字符串

Shell代碼

sed -i "s/<原始串>/<新串>/g" `grep <原始串> -rl < 目標文件或目錄>`

備注: -i 表示inplace edit,就地修改文件 -r 表示搜索子目錄 -l 表示輸出匹配的文件名 23、常用MySQL語句 //查詢mysql變量(timeout) show variables like "%timeout" //查詢緩存變量 show status like "Qcache%" //查詢進程列表 show PROCESSLIST 24、清空memcache數據 telnet 10.27.5.71 11211 flush_all quit //退出telnet 25、監控Tomcat并啟動

Shell代碼

#!/bin/sh

export _JAVA_SR_SIGNUM=12

export JAVA_HOME=/usr/java/jdk1.6.0_11

export CATALINA_BASE=/home/co_newest_family/tomcat

export CATALINA_HOME=/usr/local/apache-tomcat-6.0.18

export LD_LIBRARY_PATH=:/usr/local/lib/:/usr/local/apr/lib/:/usr/local/apr/lib/

export CATALINA_OPTS="-server -Xms1024m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=128m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9158 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dfile.encoding=UTF8 -Dmeganotes.home=/home/co_newest_family"

export PATH=$JAVA_HOME/bin:$PATH:$HOME/bin

date=`date "+%H:%M:%S"`

message="$date|check_tomcat(81_co_newest_family)_shutdown_and_restart_it."

request_url="http://10.27.5.81:9091/index.jsp"

if ! wget -t1 -T2 $request_url &> /dev/null;then

#pid=`ps aux | grep "\-Dcms4.home\=\/home\/co_newest_family\/"| awk "{print $2}"`

#kill -9 $pid

ps x|grep "tomcat"|grep -v "grep"|grep -v "sh"|awk "{print $1}"|xargs kill -9

$CATALINA_HOME/bin/startup.sh

wget -t1 -T2 http://10.27.5.112:8880/send.jsp?msg=$message &> /dev/null;

echo "$date check tomcat shutdown and restart it." >> logs/check.log

else

echo "$date check tomcat ok." >> logs/check.log

fi

rm -f index.jsp*

rm -f send.jsp?msg=*

備注:定時監控tomcat,發現掛掉,立刻重啟!并發送短信和郵件報告~ -t1 表示只請求一次 -T2 表示2秒超時 26、linux查找文件的一些方法 1) 按文件名查找 #在/opt目錄及其子目錄下查找包含文件名是以zhjedu開頭的文件 find /opt -name "zhjedu*"   2) 按時間查找 #在/opt目錄及其子目錄下查找最近1個小時修改的文件 find /opt -mtime -1 #在/opt目錄及其子目錄下查找1個小時以前修改的文件 find /opt -mtime +1 3)  按類型查找 #在/opt目錄及其子目錄下查找目錄及其子目錄 find /opt -type d #在/opt目錄及其子目錄下查找所有的普通文件 find /opt -type f 4) 按大小查找 #在/opt目錄及其子目錄下查找文件大于10M的文件 find /opt -size +10000k 27、curl命令的用法 參見1:http://blog.sina.com.cn/s/blog_62b832910100tyfi.html 參見2:http://javag.iteye.com/blog/499113 28、split切割大文件

Shell代碼

split -l 10000 log1_6.log.2012-03-21 tt.txt

備注:將log1_6.log.2012-03-21文件切割成10000行一個的以tt.txt開頭的N多個文件 -l 表示按行切割 tt.txt 表示切割后的零碎文件的前綴 29、循環讀取行 讀取文件每行并輸出 方法一:

Shell代碼

#!/bin/sh

while read line

do

echo $line

done < filename

方法二:

Shell代碼

#!/bin/sh

cat filename | while read line

do

echo $line

done

30、刪除數量比較多的文件

Shell代碼

ls | xargs -n 20 rm -rf

ls當然是輸出所有的文件名(用空格分割) xargs就是將ls的輸出,每20個為一組(以空格為分隔符),作為rm -rf的參數 也就是說將所有文件名20個為一組,由rm -rf刪除,這樣就不會超過命令行的長度了 31、for循環總結 a. for((i=1;i<=10;i++));do echo $(expr $i \* 4);done b. 在shell中常用的是 for i in $(seq 10) c. for i in `ls` d. for i in ${arr[@]}   e. for i in $* ; do f. for File in /proc/sys/net/ipv4/conf/*/accept_redirects; do g. for i in f1 f2 f3 ;do h. for i in *.txt i. for i in $(ls *.txt)    for in語句與` `和$( )合用,利用` `或$( )的將多行合為一行的缺陷,實際是合為一個字符串數組    for num in $(seq 1 100) j. LIST="rootfs usr data data2"    for d in $LIST; do    用for in語句自動對字符串按空格遍歷的特性,對多個目錄遍歷 k. for i in {1..10} l. for i in stringchar {1..10} m. awk "BEGIN{for(i=1; i<=10; i++) print i}" 注意:AWK中的for循環寫法和C語言一樣的 參考:http://hi.baidu.com/plp_cm/blog/item/d828d1881b05e2faf11f3607.html 32、格式轉換 dos2unix, unix2dos 用來實現 DOS <=> UNIX text file 轉換

Shell代碼

unix2dos target.$date.txt

dos2unix target.$date.txt

33、根據起止日期打印期間的日期

Shell代碼

#!/bin/sh

#riqizizeng

datebeg=$1

dateend=$2

#read datebeg

#read dateend

beg_s=`date -d "$datebeg" +%s`

end_s=`date -d "$dateend" +%s`

while [ "$beg_s" -le "$end_s" ]

do

day=`date -d @$beg_s +"%Y-%m-%d"`;//本次循環的日期

beg_s=$((beg_s+86400))

done

34、用awk來對比兩個文件 要求:輸出a.txt中包含b.txt的行 命令:

Shell代碼

awk "NR==FNR{a[substr($2,3)]=$0;next}{if($0 in a)print a[$0]}" a.txt b.txt > c.txt

備注:awk參數用法:http://bbs.chinaunix.net/thread-691456-1-1.htmlhttp://bbs.chinaunix.net/thread-1797847-1-1.html substr($2,3):表示截取a.txt第二列從第三個字符開始的所有字符。 if($0 in a):如果b.txt的一行跟a.txt第二列截取字符的相等。 a.txt(數據源1) ---------------- 12 x=abc 14 x=ccc 15 x=acd b.txt(數據源2) ---------------- abc ccc efg c.txt(結果) ---------------- 12 x=abc 14 x=ccc 35、在root用戶下查看端口被哪個用戶占用

Shell代碼

lsof -i:8091

36、查看一個關鍵字的前后N行

Shell代碼

cat tomcat/debuglog/debug.log.2012-07-05-21  |grep -B 5 -A 25 java.net.SocketTimeoutException

37、根據修改時間判定文件數目(適用于大數目文件夾哦)

Shell代碼

ll |awk "{print $6$7$8}" |grep Aug212012 |wc -l

備注:$6表示月份,$7表示日期(最近幾天只顯示時間),$8表示年份。 如上命令表示:2012-08-21日產生的文件數目

責任編輯:

標簽:

相關推薦:

精彩放送:

新聞聚焦
Top 岛国精品在线