1. 程式人生 > >linux的shell指令碼學習筆記(一)

linux的shell指令碼學習筆記(一)

書籍《shell從入門到精通》

1.執行shell的方式:

1).bash test.sh  

2).chmod 744 test.sh    ./test.sh

3).source test.sh

2.變數的定義:

var=123(注意'='左右倆邊不要有空格,不然會報 command not found)

如果要使用系統變數,在指令碼中先執行 source /etc/profile(定時指令碼,需要人為載入環境變數)

第一個shell指令碼:

#!/bin/bash
#學習特殊變數 $0 $? $# $* [email protected] $$ $! 位置變數${10} $1 
echo "this is my first ssh is $0 , this PID is $$"
echo "you first parma is $1"
#反引號和${}都是將命令結果作為變數值
echo 'hello world'
var=123
echo $var
str=${echo 123}
echo $str
strr=`echo 123`
echo $strr
#"" 和''的區別(單引號忽略特殊字元,輸出還是$N;而雙引號會解釋執行,輸出就是1 2 3)
N=3
VARR="1 2 $N"
varrr='1 2 $N'
echo $VARR $varrr

 第二章:字串處理${}

string='hello world!'

字串長度:${#string}    #12 

字串切片:${string:position:length}     #從索引position開始,擷取長度lenfth的子串出來(length不帶,擷取到末尾)

${string :2:4}               #'llo '

${string :(-3)}               #'ld!' 從右邊開始計數   -1,-2,-3,,,

${string :(-3):5}            #'ld!' 

替換字串:${parameter/pattern/string}

string="hello world world"

echo ${string/world/my}    # 'hello my world'      '/'代表只替換第一個符合條件的

echo ${string//world/hello}   #'hello hello hello'   '//' 代表全部符合條件的被替換

echo ${string//world/}    #'hello'   替換為空串

字串的擷取:

${param#word}   刪除匹配字首

${param##word}  

${param%word}   刪除匹配字尾

${param%%word}  

#去掉左邊(短匹配)    ##長匹配去掉左邊

% 去掉右邊 (短匹配)   %%長匹配去掉右邊

示例:pwd='/u02/tomcat8080/logs/catalina.out'

${pwd#*/}     #          'u02/tomcat8080/logs/catalina.out'

${pwd##*/}      #          'catalina.out'

${pwd%/*}         '/u02/tomcat8080/logs'

${pwd%%/*}         ''

變數狀態賦值:

${var:-string}     為空則返回string,變數值還是空

${var:+string}   不為空則返回string

${var:=string}   為空則將string重新賦值給變數並返回,變數值變為string

${var:?string}   為空則將string輸出到stderr(錯誤資訊)

var=

echo ${var:="world"}    #  world

echo ${var:-"hello"}   # world

第四章:分支和迴圈

下面是自己寫的一個關閉tomcat的指令碼:

#!/bin/bash
# this shell's name is start_tomcat.sh
for tomcat in "[email protected]"; do
if [ $(#tomcat) -eq 0 ]; then 
echo "這個分支是不會執行的,只是為了學習使用分支,所以才加的"
elif [ $(#tomcat) -lt 0]; then
echo "這個分支是不會執行的,只是為了學習使用分支,所以才加的"
else 
#最後的 grep -v $0 是將當前指令碼的執行緒排除掉。
num=$(ps -ef|grep $tomcat|grep -v grep|grep -vc $0)
pid=$(ps -ef|grep $tomcat|grep -v grep|grep -v $0|awk '{print $2}')
datestr=`date +"%F %T"`
if [$num -eq 1 ]; then
echo "kill $tomcat"
echo $datestr $(echo "kill $tomcat") >>kill_tomcat_logs 2>&1
kill -9 $pid
fi
fi
done

指令碼使用: ./kill_tomcat.sh  tomcat8080 tomcat8081 

執行後,會關閉tomca8080和tomcat8081。

下面是啟動tomcat的指令碼(伺服器上有多個tomcat)

#!/bin/bash
tomcat=$1
if [ ${#tomcat} -eq 0 ]; then 
echo "please write param like 'tomcat8080'"
else
#這個分支是為了學習倆種以“某個字串”開頭的判斷
if [[ $tomcat == tomcat808* ]]; then
echo "$tomcat is begin with 'tomcat808'"
fi
if [[ "$tomcat" =~ ^tomcat808.* ]]; then
echo "$tomcat is begin with 'tomcat808'"
num=$(ps -ef|grep $tomcat|grep -v grep|grep -vc $0)
if [ $num -eq 0 ]; then
cd /home/uo2/$tomcat/bin
./startup.sh
else
echo "the $tomcat is running ,please don't again start!"
fi
fi
fi

下面是一個檢測tomcat服務是否正常,不正常則自動重啟

#!/bin/bash
# name is check_tomcat.sh
point=$1
if [[ "$point" =~ ^808[0-3]$ ]]; then
echo "will check tomcat$point is running"
url=localhost:$point/shop/index.jsp
tomcatServiceCode=$(curl -s -o ${url##*/}) -m 20 --connect-timeout 20 $url -w 
%{http_code})
if [ $tomcatServiceCode -eq 404 -o $tomcatServiceCode -eq 200 ]; then
echo "this tomcat$point is running"
else
#這個是之前自己寫的啟動tomcat的指令碼,要保證這些指令碼在同一個目錄下
./start_tomcat.sh tomcat$point
echo "restart tomcat$point"
fi
else
echo "please write like '8080' '8081' '8082' '8083'"
fi

由於之前的指令碼都需要手動執行,所以要進一步優化為自動檢測,自動重啟。

需要準備的知識:crontab(定時)。

#!/bin/bash
# name is auto_check_tomcat.sh
points="8080 8081 8082 8083"
for point in $points ; do
if [[ "$point" =~ ^808[0-3]$ ]]; then
echo "will check tomcat$point is running"
url=localhost:$point/shop/index.jsp
tomcatServiceCode=$(curl -s -o ${url##*/}) -m 20 --connect-timeout 20 $url -w 
%{http_code})
if [ $tomcatServiceCode -eq 404 -o $tomcatServiceCode -eq 200 ]; then
echo "this tomcat$point is running"
else
#這個是之前自己寫的啟動tomcat的指令碼,要保證這些指令碼在同一個目錄下
./start_tomcat.sh tomcat$point
echo "restart tomcat$point"
fi
else
echo "please write like '8080' '8081' '8082' '8083'"
fi
done

定時:

crontab -e 

vi編輯:(每分鐘執行一次)

*/1 * * * *    /uo2/tomcat/shell/auto_check_tomcat.sh

修改預設分隔符,然後按新的分隔符分割後輸出:

預設是按空格作為分隔符如:for i in 11 22 33 ;do

echo $i

done

#!/bin/bash
old_ifs=$IFS
IFS=":"
for i in $(head -1 /etc/passwd); do
 echo $i
done
IFS=$old_ifs
#c風格的for迴圈
for ip in 192.168.1.{1..254}; do
 if ping -c 1 $ip >/dev/null; then
 echo "$ip OK."
 else
 echo "$ip NO!"
 fi
done
#檢測是否可以訪問,地址是隨便拼的
URL="10.10.120.1 10.120.120.23 100.32.43.45"
for ip in $URL ; do
 HTTP_CODE=$(curl -s -m 1 -o /dev/null -w %{http_code} http://$ip:8080/index.jsp)
 if [ $HTTP_CODE -eq 200 -o $HTTP_CODE -eq 301 ]; then
 echo "$url OK."
 else
 echo "$url NO!"
 fi
done

相關推薦

linux的shell指令碼學習筆記()

書籍《shell從入門到精通》 1.執行shell的方式: 1).bash test.sh   2).chmod 744 test.sh    ./test.sh 3).source test.sh 2.變數的定義: var=123(注意'='左右倆邊不要有空格,

Linux指令碼攻略學習筆記()

前言 繼學習Oracle高階程式設計後,在Linux環境下安裝Mysql時,徹底認識到Linux的欠缺。我們都知道Linux在伺服器領域一直處於領先地位,這很大程度要歸功於它的穩定性,安全性及其較低的總擁有成本(TCO)。經過一個為老師的推薦選擇了《Linux

shell指令碼學習筆記、shell指令碼變數語法)

sh檔案用"#!"開頭表示用什麼來執行程式,如"#!/bin/bash" 表示用bin/bash來執行sh sh檔案,預設是文字檔案,是不可以執行的,可以通過chmod允許sh檔案可以被執行,chmod命令說明如下: chmod----改變一個或多個檔案的存取模式(mode) chmod

shell指令碼學習筆記

 一、位於第一行的#! 當一個檔案中開頭是#!時,核心會掃描改行的剩餘部分,看是否存在可用來執行程式的直譯器的完整路徑,此外核心還會掃描是否有一個選項要傳給直譯器,核心會以指定的選項來引用直譯器,在搭配命令列的其他部分。 例如: 有一個csh指令碼,名為/usr/ucb

shell指令碼的作用,shell指令碼變數的定義和三種賦值方式【shell指令碼學習筆記

轉載自:http://blog.csdn.net/u010317005/article/details/50890543為什麼要用指令碼語言?以Linux系統為例,linux系統裡面有很多個命令,指令碼可以是一個或者多個命令的集合,通過執行指令碼,達到既定的功能或者效果。sh

shell指令碼判斷當前使用者是否為root(學習筆記

可以使用env檢視配置檔案找到USER這個看到當前登入的使用者名稱 [[email protected] shell_project]# env | grep USER USER=root 我把 env查詢出來的內容 使用 grep(查詢) USER 這個出來

AngularJS入門學習筆記

rect directive 技術分享 attr 兩個 ava 內容 module 大括號 首先聲明: 本博客源自於學習:跟我學AngularJs:AngularJs入門及第一個實例。通過學習,我自己的一些學習筆記。 1.AngularJS的一些基本特性 (1)使用雙大括號

Halcon學習筆記()

direct fusion 采集 das com nom pat 學習 filter 一、Halcon編程之圖像處理 1、讀取圖片 1、讀取單個圖片: 1.1 直接用算子read_image read_image (Image, ‘D:/3.tiff‘) 2

django學習筆記

site url ssa .com tin sessions .site add 註冊 2017年5月9日 ps 強烈推薦,django教程寫的很棒 http://code.ziqiangxuetang.com/django/django-tutorial.html 〇

Linux學習筆記()

版本 家目錄 動向 用戶 lin 絕對路徑 退出 鏈接庫 智能提示 1、Ubuntu 版本主版本年號+副版本月號,4月為穩定版,10月為測試版,單數為短期支持,雙數為長期支持。 2、shell為命令解析器,(shell--unix,bash--linux),大家也將bash

Tomcat學習筆記()

manage linux下 star bin servlet users 分析 clas oca Tomcat目錄結構的認識   tomcat是Apache旗下的一個開源Servlet的容器,實現了對Servlet和JSP技術支持。 通過http://tomcat

ELK學習筆記()---安裝ELK 5.x版

elk安裝ELK日誌平臺是一個完整的日誌分析系統,有三個開源工具構建組成,分別是:Elasticsearch、Logstash和Kibana。Elasticsearch用於數據分析和深度搜索;Logstash作用是從其他服務器上傳輸和轉發日誌,對其集中管理,進行分析;Kibana則是提供了強大的UI展示,將數

Git學習筆記()

編譯 缺點 watermark 索引 規範 存在 alt 回退 dsm 版本號控制系統簡單介紹 版本號控制系統是一種記錄若幹文件內容變化。以便將來查閱特定版本號修訂情況的系統。該系統不僅能夠度軟件源碼的文本文件進行版本號控制管理。也能夠對不論什麽其它類型的文件進行版本號

轉:C#制作ORM映射學習筆記 自定義Attribute類

技術 sage 其中 username pac ont 學習 collect reat 之前在做unity項目時發現只能用odbc連接數據庫,感覺非常的麻煩,因為之前做web開發的時候用慣了ORM映射,所以我想在unity中也用一下ORM(雖然我知道出於性能的考慮這樣做事不

ES6學習筆記()

message 提升 java syn log mes scrip 默認值 script 1.ES6學習之let、const (1).var、let、const 變(常)量聲明 ES5 只有全局作用域和函數作用域,沒有塊級作用域,這帶來很多不合理的場景。 在ES6中l

backbone學習筆記

router 內置 ear cti small 失敗 str 視圖view 避免 事件event on(bind) 在對象上綁定一個函數,只要該event被觸發,綁定函數即被調用。可以用第三個參數提供一個上下文 off(unbind) 移除對象上綁定的函數,可以傳遞上下文和

Microsoft.SQL.Server2012.Performance.Tuning.Cookbook學習筆記()

str perm phi prev pid brush -c rpc enabled 一、Creating a trace or workload 註意點: In the Trace Properties dialog box, there is a checkbox op

python學習筆記()

href ons xxx 自動下載 fail 響應 cdn pat pda   因為工作需要,經常需要到新浪某博客去找資料,在博文目錄裏一頁頁地肉眼搜索,看到合適的標題再點擊開鏈接查看內容,知道合適地再復制下來。很煩人。於是一直有個想法,學會爬蟲。   拿著單位發的購書卡去

QuartZ .Net 學習筆記: 源碼下載與查看

net href cnblogs 方法 category solution ges 博客 存在 最近因為工作需要研究一下QuartZ .net , 之前也用過不過但沒有深入了解, 現想深入研究一下 網上相關QuartZ .net 的文章不少, 但大部分都是源於張善友的博

Redis 學習筆記

支持 模式 包括 sun 有序 網頁 hyper 原子 類型 Redis特點:   1、速度快   2、支持豐富的數據類型:字符串、哈希列表、集合   3、操作具有原子性,所有Redis操作都是原子操作   4、多實用工具,可應用如緩存,消息隊列,應用程序中任何短期數據,如