shell 學習
一.變量設置
1.本地變量設置: 變量名=變量值
localtest=test 設置本地變量
echo $localtest 打印本地變量
set 查看本地變量
注:本地變量只對shell當前生命週期有效,退出重新登陸後失效
2.環境變量:可以應用於所有用戶進程
$HOME/.bash_profile(/etc/profile)
設置方法:
export chinaitlab=shenzhen 設置環境變量
env(export) 查看環境變量
3.變量替換
echo $變量名
4.變量清除(只讀變量無法清除,請謹慎使用)
unset 變量名
5.標準變量(基本都是環境變量,可以/etc/profile中定義)
EXINIT
HOME
IFS LINUX域之間的分隔符
LOGNAME 登陸名
MAIL 當前用戶郵箱存儲位置
MAILCHECK 檢查郵件時間間隔
MAILPATH
TEAM 終端類型
PATH 可執行文件檢索路徑
TZ 時區
PS1 SHELL登陸提示符
PS2 在一行上面運行多個命令時使用
PWD 表示當前目錄
SHELL 當前運行的SHELL版本
MANPATH 幫助文件路徑
TERMINFO
6.特殊變量
$# 傳遞到腳本的參數列表
$* 以一個單子符串顯示所有腳本傳遞參數,與位置變量不同,此選項參數可超過9個
$$ 腳本運行的當有進程ID號
$! 後臺運行的最後一個進程的進程ID號
$@ 與$#相同,但是在使用時加引號,並在引號中返回每個參數
$- 顯示shell使用的當前選項,與set命令功能相同
$? 顯示最後命令的退出狀態,0表示沒有錯誤,其它的任何值都表明有錯誤
7.影響變量的命令
decare: 設置或顯示變量
-f 顯示函數名
-r 創建只讀變量(declare和typeset)
-x 創建轉出變量
-i 創建整數變量
使用+或- 可以顛倒選項的含義(-r是不可顛倒的)
export 創建傳給子shell的變量
--表示選項結束,所有後續參數都是實參
-f 表示在"名-值"對中的名字是函數名。
-n 把全局變量轉換成局部變量。
-p 顯示全局變量列表
readonly 用於顯示或設置只讀變量
-- 表示選項結束
-f 創建只讀變量
set 設置或重設各種shell變量
shift [n] 用於移動變量位置,調整位置變量,使$3的值賦於$2, $2的值賦於$1
typeset 用於顯示或設置變量 是declare的同義詞
unset 用於取消變量的定義
-- 表示選項結束
-f 刪除只讀變量,但不能取消從shell環境中刪除指定的變量和函數。如:PATH,PS1,PS2,PPID,UID,EUID等的設置。
8.引號
1.雙引號
引用雙號號可以引用除字符$、`、\外的任意字符或字符串
2.單引號
與雙引號類型不同的是忽略所有特殊符號
3.反引號
把字符串當作系統命令來執行
4.反斜槓
如是本個字符串有特殊含義,則屏蔽其特殊含義(如:*、+、……、$、`、“、|、?)
9.運算符
運算符是對計算機發的指令
按位運算(~、〈〈、>>、&、^、|)
~ 反運算符 把二進制中的1變爲0,0變爲1
〈〈左移位運算符
如:op1<<op2(echo $[2<<4] 結果爲32) 把OP1中的二進制向左移OP2位,忽略最左端移出的各位,最右端的各位補上0值,每做一次按位左移就有實現op1乘以2
>> 右移位運算符
op1>>op2(echo $[16>>2] 結果爲4) 把OP1中的二進制向右移OP2位,忽略最右端移出的各位,最左端的各位補上0值,每做一次按位左移就有實現op1除以2
& 與比較運算符
op1&op2 (echo $[4&6] 結果爲4) op1和op2對應位,對於每個二進制來說,如果二都該位都是1,則結果爲1,否則結果爲0
^ 異或運算符
op1^op2 (echo $[2^4] 結果爲6 ecch $[4^6] 結果爲2) 比較op1與op2的對應位,如果二者該位互補,則結果爲1;否則爲0
| 或運算符
op1|op2 (echo $[2|4] 結果爲6 echo $[2|2] 結果爲2) 比較op1與op2對應位,如果二者該位有一個是1或都是1,則結果爲1,否則爲0
通過$[]求值,表示方括號中表達式求值
邏輯運算符:
0&&0 0
0&&1 0
1&&0 0
1&&1 1
0||0 0
0||1 1
1||0 1
1||1 1
賦值運算符
= += -= *+ /= %= &= ^= |= <<= >>=
let count =$count + $change
let count+=$change
example: var=65
let var+=4
echo $var
69
let var=var+10
echo $var
79
表達式替換
$[]和$( () )
習慣使用$[],所有shell的求值都是用整數完成
$[]可以接受不同基數的數字
[base#n] n表示基數從2到36的任何基數
echo $[10#8+1]
9
運算符優先級(見圖)
二、shell的輸入與輸出
1.echo
顯示文本行或變量
echo [option] string
-e 解析轉義字符
-n 回車不換行,linux系統默認回車換行
-轉義符(\c \f \t \n)
example:
#!/bin/bash
#echod
echo -e "This echo's 3 new lines\n\n\n"
echo "OK"
echo
echo "This echo's 3 new lines\n\n\n"
echo "The log files have all been done"> mylogfile.txt
結果:
This echo's 3 new lines
OK
This echo's 3 new lines\n\n\n
2.read 語句可以從鍵盤或文件的某一行文本中讀入信息,並將其同仁給一個變量。
read varible1 varible2
-如果只指定了一個變量,那麼read將會把所有的輸入賦給該變量,直到遇到第一個文件結束符或回車;如果輸出多個變量,它們按順序分別被賦予不同的變量。shell將用空格作爲變量之間的分隔符
example:
#!/bin /bash
#readname
echo -n "First Name:"
read firstname
echo "Last Name"
read lastname
echo -e "Your First Name is :${firstname}\n"
echo -e "Your Last Name is :{lastname}\n"
3. cat顯示文件內容,創建文件,可以用它來顯示控制字符
cat[option] filename1 filename2 ....
-v 顯示控制字符
不分頁顯示
4.|管道 把一個命令的輸出作爲另一個命令的輸入
df -k|awk '{print $1}'|grep -v "Filesystem"
結果:
/dev/sda1
/dev/sda2
none
5. tee 把輸出的一個副本輸送到標準輸出,另一個副本拷貝到另一個文件
-a 追加到文件末尾
example
who|tee who.cut
who|tee -a who.cut
6.標準輸入。輸出和錯誤
標準輸入描述符:0(缺省是鍵盤也可以文件和其它命令)
標準輸出描述符:1(缺省是屏幕也可以是文件)
錯誤文件描述符2 (缺省是屏幕,也可以是文件)
有12個描述符,3-9可以任意使用
7.文件重定向 改變程序運行的輸入來源和輸入地點