1.shell基礎
1.1 基礎知識
- 單引號和雙引號的區別:
- 通過單引號定義變量,輸出變量內容時單引號裏面是什麼就輸出什麼,即使內容中有變量和命令也會將它們原樣輸出;單引號中不能出現單引號,即使有轉義符號轉義了也不可以
- 通過雙引號定義變量,輸出變量時引號裏的變量及命令(要反引下)會經過解析後才輸出該變量的內容,而不是將引號中的變量或命令原樣輸出;雙引號中可以使用轉義符號
- 註釋:shell中只有單行註釋,無多行註釋。如需要臨時註釋一段代碼,後面需要取消註釋,可以用花括號括起來作爲一個函數,代碼中沒有調用此函數,這段代碼就不會執行
1.2 shell腳本實例
#!/bin/bash
echo "Hello World !"
- 說明:
#!
是一個約定標記,它告訴系統這個腳本需要什麼解釋器來執行
1.3 運行shell腳本的方式
- 1.作爲可執行程序
chmod +x ./test.sh #使腳本具有執行權限
./test.sh #執行腳本
./test.sh
表示在當前目錄找 test.sh 文件
- 2.作爲解釋器參數
# 此方式運行腳本,不需要在腳本的第一行指定解釋器信息
/bin/sh test.sh
/bin/php test.php
- 3.
sh test.sh
1.4 echo的使用
# 顯示換行
echo -e "ok! \n" #-e開始轉義
echo "It is a test"
#OK!
#
#It is a test
# 顯示不換行
echo -e "ok! \c" #-e開始轉義 \c不換行
echo "It is a test" # OK! It is a test
# 顯示結果定向至文件
echo "It is a test" > myfile
# 顯示命令執行結果,命令需要用``反引號
echo `date`
2.shell變量
2.1 變量的命名規範
- 變量名和‘=’之間不能有空格
- 變量名可以包含數字、字符和下劃線,但不能以數字開頭(可以以下劃線開頭)
- 變量名中間字符不能有空格
- 不能使用標點符號
- 不能使用bash中的關鍵字
2.2 取變量的值
- 使用一個變量時,在變量名前加上$符號即可,變量名外面的花括號可選,可以加也可以不加
# 給變量賦值
your_name="qinjx"
# 取變量值並輸出
echo $your_name
# 變量名外面的花括號是可選的,加不加都行,加花括號是爲了幫助解釋器識別變量的邊界,如:echo "I am good at ${skill}Script" => 若不加上{},那麼系統則會當做:$skillScript
echo ${your_name}
2.3 環境變量
- 作用:一般用於定義shell的運行環境,可以通過環境變量來確定登錄用戶名、命令路徑、終端類型、登錄目的等
創建與刪除
創建臨時的環境變量:可以在命令行中設置,但用戶退出命令行時這些變量值就會丟失,設置方法有如下三種:
- 1.
export name=value
- 2.
name=value export name
- 3.
declare -x name=value
- 1.
創建永久的環境變量:可以在
.bash_profile
或者.bashrc
文件中或在/etc/bashrc
或/etc/profile
或/etc/profile.d/
中定義,實例:- 1.在/etc/profile文件中添加變量
CLASSPATH
【對所有用戶生效(永久的)】
# 1.打開 /etc/profile 文件並加入如下行: export CLASSPATH="my test classpath"; # 2.保存文件後需要執行 source /etc/profile 才能馬上生效,否則只能在下次重進此用戶時才能生效
- 2.在用戶目錄下的.bash_profile(/home/elaine/)文件中增加變量,方法同上【對單一用戶生效(永久的)】
- 說明:將環境變量保存至上述文件中,每次用戶登錄時這些變量值都會被初始化一次,若想要修改後馬上生效,需要執行
source /etc/profile
,否則只能在下次重進此用戶時才能生效
- 1.在/etc/profile文件中添加變量
- 刪除環境變量:使用
unset
命令,可以直接在命令行中輸入unset name
2.4 變量的說明
- 已定義的變量可以重新被定義
變量中需要加入命令:使用反引號即可,如下例:
_filename=`ls`; echo $_filename; # 運行以上兩句,將會將當前目錄下的所有文件名與文件夾名稱全部輸出
只讀變量:用
readonly
關鍵字標記變量即可- 刪除變量:
unset
即可刪除變量,變量被刪除後不能再次使用,且不能刪除只讀變量
- shell的變量類型:運行shell時會同時存在三種變量
- 局部變量:局部變量在腳本或命令中定義,僅在當前shell實例中有效,其他shell啓動的程序不能訪問局部變量
- 環境變量:所有的程序,包括shell啓動的程序,都能訪問環境變量,有些程序需要環境變量來保證其正常運行。必要的時候shell腳本也可以定義環境變量
- shell變量:shell變量是由shell程序設置的特殊變量。shell變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了shell的正常運行
3.shell字符串與數組
3.1 字符串基礎用法
# 拼接字符串
str="${_str}${_str1}";
echo "拼接字符串_str與_str1後的字符串爲:$str";
# 獲取字符串長度
echo "length(_str) = ${#_str}";
# 截取字符串
# 第一位從0開始哈
subStr=${_str:10:6};
echo "截取字符串_str從第11個字符開始的後6個字符爲:$subStr";
3.2 數組基礎用法
- 數組聲明:
array_name(value1 value2...valuen)
- 獲取數組的值
- 獲取數組中某個元素:
${array_name[0]}
- 獲取數組中所有元素:
${array_name[*]}
or${array_name[@]
- 獲取數組中某個元素:
- 獲取數組長度:
${#array_name[*]}
or${#array_name[@]}
4.shell參數傳遞
4.1 傳遞參數基礎用法
# 傳參方式,在執行腳本後帶上參數,參數間用空格隔開
$ ./test.sh 111 222 333
# 取參方式,$n的格式獲取,n爲數字,1表示第一個參數,2表示第二個參數...,其中$0爲執行的文件名
echo "執行的文件名:$0"; #./test.sh
echo "第一個參數:$1"; #111
echo "第一個參數:$2"; #222
echo "第一個參數:$3"; #333
4.2 特殊字符
字符 | 說明 |
---|---|
$* |
以單個字符獲取所有的參數,” 2$3…” |
$@ |
獲取所有的參數,” 2”“$3”… |
$# |
獲取輸入參數的個數 |
4.3 read的常用方式
- 從終端輸入顯示的值並讀取:
read -p
orecho -n
# echo -n指定提示符
echo -n "Enter your name:"
read name;
echo "hello,$name,we are friends now!";
# 用read -p來直接指定提示符
read -p "please Enter your name:" name;
echo "hello,my name is $name";
# read -p指定多個變量
read -p "Enter your name:" first middle last
echo "Checking data for $last, $middle, $first"
- 隱藏從終端輸入的值並讀取
# 輸入時不顯示,如密碼等
read -p "please Enter your password:" -s password;
echo "my password is $password";
5.shell基本運算符
5.1 關係運算符
運算符 | 說明 |
---|---|
-eq | 判斷兩個數是否相等,相等返回true |
-ne | 判斷兩個數是否不相等,不相等返回true |
-gt | 判斷左邊的數是否大於右邊的數,是則返回true |
-lt | 判斷左邊的數是否小於右邊的數,是則返回true |
-ge | 判斷左邊的數是否大於等於右邊的數,是則返回true |
-le | 判斷左邊的數是否小於等於右邊的數,是則返回true |
5.2 布爾運算符
運算符 | 說明 |
---|---|
! | 非運算符,表達式爲false則返回true,否則返回false |
-o | 或運算符,有一個表達式爲true則返回true |
-a | 與運算符,兩個表達式都爲true才返回true |
5.3 邏輯運算符
運算符 | 說明 |
---|---|
&& | AND |
` |
5.4 字符串運算符
運算符 | 說明 |
---|---|
= | 判斷兩個字符串是否相等,相等返回true |
!= | 判斷兩個字符串是否相等,相等返回false |
-z | 判斷字符串長度是否爲0,爲0返回true |
-n | 判斷字符串長度是否爲0,不爲0返回true |
字符串本身 | 判斷字符串是否爲空,不爲空返回true,例:[$a]返回false |