1. 程式人生 > >linux shell script總結

linux shell script總結

在一些linux系統管理和自動化測試中經常需要寫一些shell指令碼,所以這裡總結一下主要的規則,便於以後編寫時查閱。
shell的開頭必須以 #!/bin/bash開頭,表明是使用/bin/bash來解釋指令碼的執行。 shell的註釋用#
可以使用source命令來執行指令碼,也可以直接將shell指令碼檔案加上可執行許可權,直接執行
一:變數
1.定義變數 : aa=”qq” 注意等號兩側不能有空格
2.特殊的自動變數:
$$ : 取當前程序的id,就是執行該指令碼的程序的pid
$0 : 取當前檔名
$n : n是大於0的數字,n是幾就是取第幾個引數
$# : 取引數的個數
$*

: 取所有的引數, 格式為“$1 $2 $3 ...”
[email protected] : 也是取所有的引數,格式為"$1" "$2" "$3"... 一般使用這個。
$? : 取命令的退出狀態,0為沒有錯誤,其實就是取該命令的main函式的return value。shell也可以有return value,可以在shell指令碼中呼叫exit 0來返回value。 執行完後可以echo $?來檢視return value
3.取變數的值,可以$aa,或者${aa}, 不能用()

二:數值的運算
1.由於shell的變數都是字串,所以當要用到數值的計算時,不能簡單的兩個變數相加,如

a1=4
a2=2
a3=$a1+$a2
echo $a3

我們會發現輸出的a3內容為”4+2”, 是一個字串。所以,要進行數值計算,必須要使用$((計算式))格式,如:

a1=2
a2=4
a3=$(($a1+$a2)) 
a4=$((4+3))  
echo $a3
echo $a4

這樣輸出的a3就是6. a4就是7.
數值運算子為 + - * / % 加減乘除 取餘 bash shell只支援整數
2.數值關係運算符:
數值的關係運算也不能用簡單的> < 等來運算,而是有特殊的運算子:
-eq 相等返回true
-ne 不相等返回true
-gt 大於返回true
-lt 小於返回true
-ge 大於等於返回true
-le 小於等於返回true

三: shell的布林運算
!:取反運算 [!false]=true
-o :或運算 [$a -lt 20 -o $b -gt 100] a小於20 或者b大於100
-a : 與運算 [$a -lt 20 -a $b -gt 100] a小於20同時b大於100

四 shell字串運算:
== 或者 = :判斷兩個字串是否相等,前後需要空格。==和=功能是一樣的,但前後都需要空格,與賦值要區別開,賦值=前後不能有空格。為了和賦值區分,我們建議這裡使用==。
!= : 判斷兩個字串是否不相等 前後需要空格
-z : 檢測字串長度是否為0,是0返回true 比如: [-z $nane] 判斷name字串長度是否為0
-n : 檢測字串長度是否不為0,不為0返回true
[] :檢測字串是否為空,不為空返回true 如[ $a ]
字串連線 : str=${str1}${str2},也可以str=$str1"--"$str2,結果就是str1–str2

五: shell檔案測試運算子
-d file 檢測檔案是否為目錄檔案,目錄返回true
-f file 檢測檔案是否為普通檔案,普通檔案返回true
-r file 檢測檔案是否可讀
-w file 檢測檔案是否可寫
-x file 檢測檔案是否可執行
-s file 檢測檔案大小是否為0,大於0返回true
-e file 檢測檔案是否存在,包含目錄檔案

六:shell的單引號和雙引號的使用:
單引號中不能包含單引號,單引號中的轉移字元\和變數$字元都會原樣輸出,無實際意義
雙引號不能包含雙引號,雙引號的轉移字元\$有實際意義,會取變數的值。

七 shell常用的萬用字元:
* : 匹配0或者多個字元
? : 匹配任意一個字元
a[xyz]b :可匹配ab之間有xyz任何一個字串,有且只有一個,也就是axb ayb azb這三種情況
a[!xyz]b 或者a[^xyz]b : ab之間只有一個字元,且非xyz中的字元。一般使用^來作為反向選擇
a[1-9]: 匹配1-9中的任何一個,比如a1
a{abc,123} : aabc 或者a123
例子:

a=$(ls te[Ss]t.sh)
如果test.sh或者teSt.sh存在,則會賦值給a。

八: shell中的特殊字元
> : 輸出重定向 ,比如cat 1.txt 2.txt > 3.txt 會將1.txt和2.txt中的內容輸入到3.txt中,如果3.txt已經存在,原來的內容會被覆蓋
>> : 輸出追加重定向,功能類似重定向,但是如果3.txt已經存在,不會覆蓋原來的內容,會在原來的內容之後追加。
< : 輸入重定向
; : 命令分隔符,允許一行寫多條命令
&& : 若前面一條執行成功,則執行下一條命令
|| : 前一條命令執行不成功,執行下一條命令
!4 : 執行history中的第4條命令

九: shell的陣列操作
array=(a1 a2 a3) shell只支援一維陣列
a[0]=1;a[2]=2 通過賦值的方式定義陣列
陣列的取值方式:
${陣列名[index]} 如 : ${a[0]}
${a[*]} 和 ${a[@]} 都是取陣列的所有元素
len=${#a[*]} 獲取陣列的長度

十. shell的if語法

if [ 條件成立 ];then      //注意if後面需要空格,“[”後和“]”前都需要空格
語句
elif [ 條件成立 ];then
語句
else
語句
fi
條件判斷可以使用-o -a來同時判斷多個條件,也可以使用|| 和&&,例項如下:
[ "$name" == "cc" -o  "$name" == “jj” ]  也可以寫成["$name" == "cc" ] || ["$name" == "jj" ]  
&&也是一樣的

十一 : shell的case判斷

casein1)
命令
;;   同break,跳出語句
值2)
命令
;;
*)
命令
;;
esac

例子:

a=$1
case $a in
”one“)
bash /usr/local/1.sh
;;
c)
touch /usr/local/2.sh
;;
*)
touch /usr/local/3.sh
;;
esac

十二:shell for迴圈
1.固定迴圈

for 變數 in 列表
do
命令
done
例子:
path='/root'
for file in $path/*
do
if [ -x $file -a -f $file]
then
echo $file
fi
done
例子2
for animal in dog cat elephant
do
echo "There are $(animal)s"
done

2.數值處理
for ((初始值;限制值;執行步長))
do
程式段
done
例子:

s=0
for ((i=1; i<101; i=i+1))
do
s=$(($s+$i))
done

十三: shell while迴圈

while [ condition ]
do
命令
done

還有一種until迴圈,如下

until [ condition ]
do
命令
done

這個和while迴圈相反,是condition為true時停止執行
例子:

while [ "$yn" != "yes" -a "$yn" != "YES" ]
do
read -p "Please input yes/YES to stop this program" yn
done
echo "success"
until為:
until[ "$yn" == "yes" -o "$yn" == "YES" ]
do
read -p "Please input yes/YES to stop this program" yn
done
echo "success"

十四: shell中的函式

function 函式名()
{
命令
return x
}
例子:
function show()
{
for file in $1/*.sh
do
echo $file
done
}
呼叫函式
show $1

因為shell是從上到下,從左到右執行的,所以定義的函式必須放在檔案的開頭,這樣執行的時候才能找到。
函式內部也是有區域性變數的,就是呼叫函式時傳入的引數,所以在函式內部$0為函式名稱,$1就是呼叫函式時傳入的第一個引數,其他以此類推。
十五: 使用者輸入 read命令
read var 會提示使用者輸入,輸入的資訊會存在var變數中。

十六 :test命令和判斷符號[ ]
他們的應用基本一樣,比如
test -e ./1.txt && echo “exit” || echo “not exist” //判斷1.txt是否存在,如果存在還會執行&&後面的語句,如果不存在,會執行 || 後面的語句
[ -e ./1.txt ] && echo “exit” || echo “not exist” //注意判斷式的兩邊必須要有空格
使用中括號[ ]需要注意一下幾個點:
1.在中括號內的每個元件都需要用空格鍵來分隔
2.在中括號內的變數,最好都用雙引號括起來,比如[ “$name” == “ccjing” ]
3.在中括號內的常量,最好要以單引號或者雙引號括起來
例子:

name="xiao ming"
[ $name == "xiao" ] || echo "not xiao ming"  //這句話會報錯,因為$name會替換為 xiao ming  結果就是 xiao ming == “xiao”  所以shell會報錯,所以不管變數還是常量,最後都用引號括起來。

十七: 將shell命令的結果賦值給shell script的變數
var=$(command)
例如:date_second=$(date +%s) 就會得到現在的以秒為單位的日期。date命令可以參考date –help

下面列舉一些shell script的例子:
1.輸入一個日期,計算距離現在的天數

#!/bin/bash
read date_input
date_tmp=$(echo $date_input | grep '[0-9]\{8\}') #利用正則表示式來檢查輸入的格式是否是YYYYmmdd格式
if [ "$date_tmp" == "" ];then
echo "You input wrong date format"
exit1
fi
declare -i date_dem=$(date --date=$date_input +%s)  #定義一個整數型, 利用date命令來計算輸入的日期的秒數
declare -i date_now=$(date +%s)  #計算現在時間的秒數
declare -i date_total_s=$(($date_dem-$date_now))  #計算差額
declare -i date_d=$(($date_total_s/60/60/24))  #將秒數換算為天
echo "The result is $date_d"

2.計算100的階乘

#!/bin/bash
s=1
i=1
while [ "$i" != "101"]
do
s=$(($s*$i))
i=$(($i+1))
done

相關推薦

linux shell script總結

在一些linux系統管理和自動化測試中經常需要寫一些shell指令碼,所以這裡總結一下主要的規則,便於以後編寫時查閱。 shell的開頭必須以 #!/bin/bash開頭,表明是使用/bin/bash來解釋指令碼的執行。 shell的註釋用# 可以使用so

linux shell 指令總結

一  shell 基本指令 1.   $ --普通使用者    # -- 超級使用者 xx  --help    檢視xx 指令幫助 man xxx    檢視xx指令用法 &nb

linux shell script中的函式簡介

        懂C語言的人, 沒有不知道函式的, 下面我們來看看linux shell script中的函式, 其實也很簡單: [[email protected] learn_shell]$ ls a.sh [[email protected] l

linux shell script程式之選擇結構簡介

        很多人都是先學習C/C++語言, 然後再學習shell script的。 如果大家有一點點程式設計基礎, 那麼就很容易理解所謂的順序、選擇和迴圈。順序結構其實沒什麼好說的, 之前早就接觸過了, 在本文中, 我們來介紹一下選擇結構。 雖然簡單, 但還是要熟練正

linux shell script 進階篇(1)--如何打造功能強大的函式?

函式不管在那個程式語言中都有舉足輕重的地位,在linux shell script中當然也不例外,下面我們就一起學習如何打造出功能強大的函式。 1.如何在script中建立一個函式,可以用以下兩種方式: A.  function name {   commands } B.

Linux shell學習總結

1、#!/bin/sh    定義指令碼直譯器,將shell語句翻譯成機器語言                                        2、${var}   變數定義:通過$符號定義,變數又可以分為環境變數,指令碼變數等;統計變數的資訊有如下指令:

Linux shell script 的 關閉echo -e 在shell指令碼中輸出 “-e”

第一次寫 script指令碼 按照鳥哥的hello world 的程式寫了一下: #!/bin/bash # Program: # This program shows "hello World!" in your screen. #History: # 2015/07/1

linux-shell-命令總結

方法名 ash 方法 程序 字符 總結 就是 可執行 圖片 第一種方法執行: 第二種方法執行: 第三種方法執行: 第四種方法:執行

Linux Shell Vim 經常使用命令、使用技巧總結

fetch comm 顯示行號 view ava string 文件 fun 更新 前言 本文總結了自己實際開發中的經常使用命令,不定時更新,方便自己和其它人查閱。 如有其它提高效率的使用技巧。歡迎留言。 本文地址 http://blog.csdn

Linux(7)學習shell script

一.什麼是shell script shell script 是利用 shell 的功能所寫的一個『程式 (program)』,這個程式是使用純文字檔,將一些 shell 的語法與指令(含外部指令)寫在裡面, 搭配正規表示法、管線命令與資料流重導向等功能,以達到我們所想要的處理目的。簡單的說,

鳥哥的Linux私房菜讀書筆記--shell script的追蹤與debug

關於sh命令     [[email protected] ~]$ sh [-nvx] scripts.sh         選項與引數:     &nbs

Linux shell 自動安裝總結

本文主要針對web專案自動安裝shell指令碼中常用linux命令總結如下: 1. 將一條命令的執行結果賦值給一個變數: #獲取執行指令碼的當前路徑 zit_script_path=$(cd "$(dirname "$0")" && pwd) #獲取執行指令碼的當前路徑

linux/ubuntu下shell script的 [: xxx: unexpected operator 之坑

       緊急修復一個問題,需要改shell script,  簡單描述如下: #! /bin/bash x="hello" if [ "${x}" == "hello" ]; then ech

Linuxshell script

Linux的shell script //編輯shell: vi a.sh //子程序執行shell sh a.sh //主執行緒執行shell source a.sh 相關例子: #!/bin/bash echo "hello linux!" #!/bin/bash echo "我要建立三個檔案"

Linux+Shell常用命令總結

因為自己不經常使用linux的命令列工具,但是mac的終端還是經常使用的,有些命令總是要想一會或者百度一下才知道怎麼用,抽時間整理了一下常用的命令,作為筆記. 常用命令 檢視檔案操作:   ls :列出當前目錄下所有檔案和目錄   cat file:檢視檔案內容  -n:顯示行號    less file:

Linux初學之Shell script

遍歷目錄: for file in `ls /etc`; do echo "${file}" done file:變數 `ls /etc` 等效於 $(ls /etc) echo :輸

linux shell獲取字串長度的多種方法總結

前言 我們在日常工作中,對於求字串操作在shell指令碼中很常用,實現的方法有很多種,下面就來給大家歸納、彙總了求字串的幾種可能方法,話不多說了,來一起看看詳細的介紹吧。 方法如下: 【方法一】:利用${#str}來獲取字串的長度 【方法二】:利用awk的length方法

實用指令碼----Linux下Jdk和Tomcat自動安裝shell指令碼總結

一、JDK 自動安裝指令碼 jdk自動安裝bash shell指令碼,截止今天(2014/10/15)親測可用: sudo su #切換到root許可權 mkdir /usr/local/java cd /usr/local/java #download jdk 1.7.67 wget --no-ch

linuxshell程式設計總結

概念 shell是一種弱型別、解釋型語言,不需要編譯,只需要一個直譯器,這裡我們用bash。 輸入如下命令: more /etc/passwd 可以看到: 當前使用者root登入的時候,預設開啟的命令列使用者介面就是bash,在這個bash中輸

linux下網路shell命令總結(一)

網路和監控命令類似於這些: hostname, ping, ifconfig, iwconfig, netstat, nslookup, traceroute, finger, telnet, ethtool 用於檢視 linux 伺服器 ip 地址,管理伺服器網路配置,通過 telnet