shell腳本會了嗎,不會的看這里,教你一一來學,還有實例哦
1.shell腳本
定義:多條命令按順序執行,就是shell腳本
例如:vim hello.sh
兩種執行的方式:
1.直接執行:bash hello.sh
2.給當前用戶或所有用戶加上可執行權限,再執行:./hello.sh
chmod u+x hello.sh //對當前用戶增加執行權限
1.2 shell變量
1.2.1. 賦值:變量名=值
(1) 變量不用定義,直接賦值即可, 賦值時,賦值號前后不能有空格
(2) 賦值給變量的數據當字符串處理
注意:shell里邊變量名提議用大寫的
例子:DATE=`date`
1.2.2. 取值
$變量名或${變量名}
注意:取變量值的時候,需要給美金符號($)
1.2.3. 刪除變量值:unset 變量名
例子:unset DATE
實例:給IFPO賦值一個命令, 然后echo輸出命令
1.3命令行參數變量
命令行:腳本啟動時,shell程序會自動賦值,在腳本中可以直接取值:
$0 腳本名
$1 - $9 腳本參數
$* 所有的命令行參數
$# 命令行參數個數
$? 前一個命令的結果
$$ 當前shell腳本進程ID
0 正常退出 //這里可以判斷一下ls -l +文件名存在的時候,執行完之后的結果
1 異常退出 //這里可以判斷一下ls -l +文件名不存在的時候,執行完之后的結果
同樣可以有參數:
實例:
1.4系統環境變量
系統shell賦值的變量,shell腳本中可以直接使用:
$PATH 執行命令時,未指定命令的絕對路徑,從此變量指定的路徑中搜索
$HOME 指定用戶主目錄:/home/ubuntu
追加環境變量路徑:
導出環境變量:在子處調用父中變量
補充:注釋:以#打頭的行
1.5 read
用處:讀取一行用戶輸入
read VAR(定義變量)
echo $VAR(輸出變量值)
實例:
補充:指定腳本解析器:#!/bin/bash
echo $SHELL:查看當前自己環境用的bash
1.6算術計算命令(expr.sh)
expr 數學表達式
數學表達式中支持的運算符:+, -, \* , /, %
注意:乘法(因為*有特殊含義,需要轉義)
實例:
注意:運算符前后都有空格,不加空格,會把我們的值理解成字符串
等號前后不需要空格
補充:其他算法
(1)let
例如:var=1
let "var+=1"
echo $var
注意:a)經測試let幾乎支持所有的運算符,在網上看到一篇文章說“let不支持++、--和逗號、(、)”,但經測試自加、自減、以及括號的優先級都得到了很好的支持
b)方冪運算應使用“**”
c)參數在表達式中直接訪問,不必加$
d)一般情況下算數表達式可以不加雙引號,但是若表達式中有bash中的關鍵字則需加上
e)let后的表達式只能進行整數運算
(2)使用(())
var=1
((var+=1))
echo $var
輸出結果為2
注意:(())的使用方法與let完全相同
(3)使用$[]
var=1
var=$[$var+1]
echo $var
輸出結果位2
注意:a)$[]將中括號內的表達式作為數學運算先計算結果再輸出
b)對$[]中的變量進行訪問時前面需要加$
c)$[]支持的運算符與let相同,但也只支持整數運算
(4)使用expr
var=1
var=`expr $var + 1`
echo $var
輸出結果為2
注意:a)expr后的表達式個符號間需用空格隔開
b)expr支持的操作符有: |、&、<、<=、=、!=、>=、>、+、-、*、/、%
c)expr支持的操作符中所在使用時需用\進行轉義的有:|、&、<、<=、>=、>*
e)expr同樣只支持整數運算
1.7測試命令
test 表達式
等價于:[ 表達式 ]
注意: [ 后面一定要有空格, ] 前面一定要有空格
test命令沒有輸出, 只有程序退出狀態
表達式(注意: 運算符合操作數之間有空格):
1. 字符串比較
str1 = str2 相等(注意空格)
str1 != str2 不等
-z str 為空
-n str 不空
2. 整數比較
a -eq b 相等
-ne 不相等
-ge 大于等于
-le 小于等于
-gt 大于
-lt 小于
3. 文件測試
-d file 目錄? (file即為要測試的文件)
-e file 存在文件或目錄?
-f file 普通文件?
-r file 存在可讀?
-w file 存在可寫?
-x file 存在可執行?
-s file 存在長度不為0
f1 -nt f2 f1 比 f2新?
f1 -ot f2 f1 比 f2舊?
4. 邏輯運算
a -a b 且
a -o b 或
注意;0表示真 1表示假
測試語句:echo $? //輸出上一次的返回結果
實例
1.8 if語句
1.8.1. if
語法
if [命令1] 相當于if()
then {
命令列表 語句
fi }
執行流程:(1) 執行 命令1
(2) 如果為真($? 為 0), 執行 命令列表
5.8.2 if ... else
語法
if 命令1
then
命令列表1
else
命令列表2
fi
執行流程:(1) 執行 命令1
(2) 如果為真($? 為 0), 執行命令列表1
如果為假, 執行命令列表2
1.8.3 if ...elif...elif...
語法
if 命令1
then
命令列表1
elif 命令2
then
命令列表2
else
命令列表*
fi
執行流程:(1) 執行 命令1
(2) 如果為真, 執行 命令列表1
(3) 如果為假, 執行 命令2
(4) 如果為真, 執行 命令列表2
如果為假, 命令列表*
實例:
1.9 case語句
1.9.1語法
case 值(結果為字符串的表達式或變量) in
模式1)(類似于通配符)
命令
;;(類似于break)
模式2)
命令
...
;;
*)//默認模式
命令
...
;;
Esac
注意:模式可以包含 *, ?, [...]等文件名匹配模式(模式就是正則表達式)
例如:y | yes | Y | Yes)
實例:
1.10 while
1.10.1 語法
while [ 關系表達式 ]
do
命令列表
done
1.10.2 流程
(1) 執行 [ 關系表達式 ]
(2) 結果為真, 執行 命令列表后,再執行(1)
假 結束 while語句
實例:
1.11 continue
1.11.1語法
continue n
n 為整數
1.11.2 執行流程
結束n層的本次循環
實例:計算奇數和
1.12 for
1.12.1. 語法
for 變量 in 字符串列表
do
命令列表
done
注意:in 后面到列表省略,表示使用腳本參數做為字符串列表
1.12.2 執行流程
變量按順序取字符串列表中到值,每個值執行一次命令列表
實例:
1.13 break
1.13.1 語法
break n(n 為整數)
1.13.2 執行流程
結束n層循環
實例:
1.14 函數
1.14.1 定義
function 函數名()
{
local 變量賦值
命令列表
...
return 值
}
注意:function 關鍵字可以沒有,但是函數名()必須有
函數可以用$0 - $9的變量,從函數外獲取值
return 命令可以返回值給$?變量
local申明的變量作用范圍為函數內部
2. 調用
OUT=`function_name 參數1 參數2`
function_name 參數1 參數2
定義在前,調用在后,且必須在同一個腳本中
OUT變量可以獲取到函數的輸出
實例:
注意:在文件系統中,禁止將自己的目錄下的所有文件拷貝到自己目錄下的某個文件