第一章 SHELL 簡介
cat /etc/shells 查看系統中所有的shell
echo $SHELL 查看當前用戶運行的shell
程序在shell中運行,shell中可運行子shell
文件類型:
d 目錄。
l 鏈接文件(指向另一個文件),類似於WINDOWS快捷方式。
s 套接字文件。
b 塊設備文件。
c 字符設備文件。
p 命名管道文件。
- 普通文件,或者更準確地說,不屬於以上幾種類型的文件
查看名用法:main chmod或者info chmod
改變文件權限:root用戶和文件的擁有者才能夠改變文件權限
命令:chmod
chmod u+x,g-r,o+x a
chmod 722 a
chown 改變文件的擁有者
chown 用戶名 文件名
chown -R 用戶名 文件夾名 可以改變文件夾下所有文件的擁有者
chgrp 改變文件的組
chgrp 組名 文件名
chown root.root 文件夾 -R
umask
設置創建文件或文件夾的默認權限
默認爲022,可以通過umask 222設置默認權限
鏈接
硬連接和軟連接
ln [-s] source_path target_path
ln a a_ln 硬鏈接
ln -s a a_ln 軟鏈接
SHELL
#!/bin/bash
#hello world
printchar="hello world"
echo $printchar
chmod u+x hello.sh
./hello.sh
別名
alias
alias ll='ls -alh'
別名 $HOME/.bashrc文件中
命名替換
myfile的內容
parm
findfile
ls `cat myfile` -al 顯示parm findfile文件的信息
把cat myfile命令的結果傳遞給ls命令
後臺處理
nohup command &
nohup tar -czf parm.tar.gz parm &
tar -czf parm.tar.gz parm壓縮文件
管道 (|)
把一個命令的輸出連接到另一個命令的輸入
ls|sort 排序
重定向(< >)
與管道相關,他可以改變程序運行的輸入來源和輸入來源
sort <myfile.txt 對myfile.txt文件中的內容排序
sort <myfile.txt > myfile_sort.txt 把myfile.txt文件中的內容排序的結果輸入到myfile_sort.txt文件中
模式匹配
顯示以txt爲擴展名的文件或顯示以a開頭的文件,這種能力就稱模式匹配
正則表達式
特殊符號
雙引號("):用來使Shell無法認出空格、製表符和其他大多數特殊字符,這樣"David Medinets"
表示一個值,而不是2個同樣"David < Medinets"表示一個值
單引號('):用來使shell無法認出所有特殊字符
反引號(`):用來替換命令
反斜槓(\):用來使shell無法認出氣候的特殊字符,使其後的支付失去了特殊的含義,如David\Medinets
touch David\ Medinets
ls David\ Medinets
分號(;):允許在一行上放多個命令
& :命令後臺執行
括號():創建成組的命令
大括號{}:創建命令塊
豎槓(|):管道表示符
<>&:表示重定向
*?[]! :表示模式匹配
$:變量名的開頭
#:表示註釋(第一行除外)
空格、製表符、換行符:當作空白
第二章 變量和運算符
2.1變量
2.1.1本地變量
本地變量在用戶現在的shell生命期的腳本中使用
variable_name=vale
set 顯示本地所有的變量
readonly variable_name 只讀變量
[root@localhost shell]# LOCALTEST="test" #設置本地變量
[root@localhost shell]# echo ${LOCALTEST} #查看本地變量
test
[root@localhost shell]# readonly LOCALTEST #設置本地變量爲只讀
[root@localhost shell]# LOCALTEST="TEST1" #設置只讀的本地變量,提示變量爲只讀
-bash: LOCALTEST: readonly variable
[root@localhost shell]# readonly #查看當前shell只讀的本地變量
2.1.2環境變量
環境變量用於所有用戶進程(經常稱爲子進程)。登錄進程爲父進程。shell中執行的用戶
進程均稱爲子進程。不像本地變量(只用於現在的shell),環境變量可用於所有子進程,
這包括編輯器、腳本和應用
cat /etc/profile(對所有用戶進行設置)或cat $HOME/.bash_profile(對當前用戶設置)
export 設置環境變量或者查看環境變量 export user_path="beij"或export
env 查看環境變量 env | grep user_path
2.1.3變量替換
用變量的值替換它的名字
echo
在變量名前加$,使用echo命令可以顯示單個變量取值
[root@localhost ~]# testvar="this is a test"
[root@localhost ~]# echo $testvar
this is a test
替換變量
testvar="hxy"
${testvar} 顯示實際值
${testvar:+"test"} 如果設置了testvar 則顯示其值,否則,爲空
${testvar:?"errmsg"} 如果未設置testvar 顯示用戶定義錯誤信息errmsg
${testvar:-"test"} 如果未設置testvar 則顯示其值test
${testvar :=value} 如果未設置testvar 設置其值,並顯示
2.1.4變量清除
unset,readonly 不能unset
unset varable_name
[root@localhost ~]# testvar="this is a test"
[root@localhost ~]# echo $testvar
this is a test
[root@localhost ~]# unset testvar
[root@localhost ~]# echo $testvar
[root@localhost ~]
2.1.5位置變量
位置變量表$0,$1...$9
$0 $1 $2 $3 $4 $5 $6 $7 $8 $9
腳本名稱 A B C D E F
向腳本中使用位置參數
parm文件內容如下:
echo "這個腳本的名稱:$0"
echo "這是腳本的第1個位置參數:$1"
echo "這是腳本的第2位置參數:$2"
echo "這是腳本的第3個位置參數:$3"
echo "這是腳本的第4個位置參數:$4"
echo "這是腳本的第5個位置參數:$5"
echo "這是腳本的第6個位置參數:$6"
echo "這是腳本的第7個位置參數:$7"
echo "這是腳本的第8個位置參數:$8"
echo "這是腳本的第9個位置參數:$9"
chmod u+x parm
[root@localhost hxy]# ./parm A B C D E
這個腳本的名稱:./parm
這是腳本的第1個位置參數:A
這是腳本的第2位置參數:B
這是腳本的第3個位置參數:C
這是腳本的第4個位置參數:D
這是腳本的第5個位置參數:E
這是腳本的第6個位置參數:
這是腳本的第7個位置參數:
這是腳本的第8個位置參數:
這是腳本的第9個位置參數:
向系統命令傳遞參數
parm.sh 內容如下:
#!/bin/bash
#parm.sh
find /root/shell -name $1 -print
[root@localhost shell]# chmod u+x parm.sh
[root@localhost shell]# ./parm.sh parm
/root/shell/parm
2.1.6標準變量
bash默認建立了一些標準環境變量,可在/etc/profile中定義
set | grep "TERM"或者echo $TERM
EXINIT: 初始化vi的參數
HOME: 主目錄
IFS: linux默認的域,字符與字符之間的間隔
LOGNAME: 登錄用戶名 也可以用set |grep "LOG"命令查看
MAIL: 當前用戶郵箱的路徑
MAILCHECK: 當前用戶有多個郵箱時
TERM:終端的類型
PATH:可執行文件尋找的路徑
TZ:表示時區
PS1:登錄系統的提示符 [root@localhost shell]#
PS2:
PWD:當前的目錄
SHELL:當前用戶運行的shell
MANPATH:幫助文檔存放的路徑
TERMINFO:終端類型配置信息的路徑
2.1.7特殊變量
$#(傳遞到腳本的參數個數)
$*(以一個單字符串表示所有向腳本傳遞的參數,與位置變量不同,此選項參數可超過9個)
$$(腳本運行的當前進程ID號)
$!(後臺運行的最後一個進程的進程ID號)
$@(與$*相同,但是使用時加引號,並在引號中返回每個參數)
$-(表示shell使用的當前選項,與set命令功能相同)
$?(顯示最後命令的退出狀態,0表示沒有錯誤,其他值表面有錯誤)
[root@localhost shell]# vi parm
echo "這個腳本的名稱:$0"
echo "這是腳本的第1個位置參數:$1"
echo "這是腳本的第2位置參數:$2"
echo "這是腳本的第3個位置參數:$3"
echo "這是腳本的第4個位置參數:$4"
echo "這是腳本的第5個位置參數:$5"
echo "這是腳本的第6個位置參數:$6"
echo "這是腳本的第7個位置參數:$7"
echo "這是腳本的第8個位置參數:$8"
echo "這是腳本的第9個位置參數:$9"
echo "顯示參數個數:$#"
echo "顯示腳本全部參數:$*"
echo "顯示進程ID:$$"
echo "顯示前一命令運行後狀態:$?"
[root@localhost shell]# ./parm A B C D E
這個腳本的名稱:./parm
這是腳本的第1個位置參數:A
這是腳本的第2位置參數:B
這是腳本的第3個位置參數:C
這是腳本的第4個位置參數:D
這是腳本的第5個位置參數:E
這是腳本的第6個位置參數:
這是腳本的第7個位置參數:
這是腳本的第8個位置參數:
這是腳本的第9個位置參數:
顯示參數個數:5
顯示腳本全部參數:A B C D E
顯示進程ID:2776
顯示前一命令運行後狀態:0
2.1.8影響變量的命名
declare
- 設置或顯示變量
- -f只顯示函數名
- -r創建只讀變量(declare和typeset)
- -x創建轉出變量
- -i創建整數變量
- 使用+替代-,可以顛倒選項的含義
export
用於創建傳給子shell的變量
- --表明選項結束,所有後續參數都是實參
- -f表明在“名-值”對中的名字是函數名
- -n把全局變量轉換成局部變量。換句話說,命令的變量不再傳給shell
- -p顯示全局變量列表
readonly
- 用於顯示或設置只讀變量
- --表明選項結束
- -f創建只讀變量
set
- 設置或重設各種shell
unset
- 用於取消變量的定義
- --表明選項結束
- -f刪除只讀變量,但不能取消從shell環境中刪除指定的變量和函數。
如PATH,PS1,PS2,PPID,UID,EUID等的設置
shift[n] n移動的個數
- 用於移動位置變量,調整位置變量,使$3的值賦予$2,使$2的值賦予$1
typeset
- 用於顯示或設置變量
- 是declare的同義詞
2.2引號
2.2.1引號的必要性
變量和替換操作,在腳本中執行變量替換時最容易犯的一個錯誤就是引用錯誤
2.2.2雙引號
使用雙引號可引用除字符$、`、\外的任意字符或字符串
ehco -e "ert,$SHELL '\n*china`echo itlab` "
ert,/bin/bash
*chinaitlab
2.2.3單引號
單引號與雙引號類型,不同的是shell會忽略任何引用值。換句話說,如果屏蔽了
其特殊含義,會將引號裏的所以字符,包括引號都作爲一個字符串
ehco -e 'ert,$SHELL '\n*china`echo itlab` '
ert,$SHELL '\n*china`echo itlab`
2.2.4
反引號
反引號用於設置系統命令的輸出到變量。shell將反引號中的內容作用一個系統命令,
並執行其結果
[root@localhost shell]# echo "* china`echo itlab`"
* chinaitlab
2.2.5
反斜槓
如果一個字符有特殊含義,反斜槓防止shell誤解其含義,即屏蔽其特殊含義
下面字符包含有特殊意義,& * + ^ $ ` " | ?
[root@localhost shell]# echo *
David Medinets hello.sh myfile myfile.txt parm parm.sh sort
You have new mail in /var/spool/mail/root
[root@localhost shell]# echo \*
*
2.3運算符
運算符是對計算機發的指令
運算對象:數字、字符(字面值);變量;表達式
表達式:運算符和運算對象的組合體
2.3.1運算符類型
按位運算
~,<<,>>,$,|,^
$[ ]表示形式告訴shell對方括號中的表達式求值
$[2+8]
運算符 說明
~op1 反運算符,把op1中所有的二進制爲1的變爲0,0變爲1
op1<<op2 左移運算符,把op1中的二進制位向左移動op2位,忽略最左端移出的各位
,最右段的各位補上0值,每做一處按位左移就實現op1乘以2
op1>>op2 右移運算符,把op1中的二進制位向右移動op2位,忽略最右端移出的各位
,最左段的各位補上0值,每做一處按位右移就實現op1除以2
op1&op2 與比較運算符,op1和op2對應位,對於每個二進制位來說,如果二者該位
都是1,則結果爲1,否則結果爲0
op1^op2 異或運算符,比較op1和op2對應位,對於每個二進制位來說,如果二者該位
互補,則結果爲1,否則結果爲0
op1|op2 或運算符,op1和op2對應位,對於每個二進制位來說,如果二者該位
有一個1或者都是1,則結果爲1,否則結果爲0
邏輯運算符
運算符 說明
&& 與運算符
|| 或運算符
>,==,<,!= 大於,等於,小於,不等於運算符
賦值運算符
=,+=,-=,*=,/=,%=,$=,^=,|=,<<=,>>=
let count=$count+$change
let count+=$change
2.3.2表達式替換
$[]和$(())
習慣使用$[],所有shell的求值都是用整數完成
$[]可以接受不同基數的數字
[base#n] n表示基數從2到36的任何基數,表示進制
echo $[10#8+1]
9
運算符的優先級(用括號來改變運算順序)
級別 運算符 說明
13 -,+ 正,負
12 !,~ 邏輯或,按位取反或補碼
11 *,/,% 乘,除,取摸
10 +,-, 加,減
9 <<,>> 按位左移,按位右移
8 <=,>=,<,> 小於等於,大於等於,小於,大於
7 ==,!= 等於,不等於
6 & 按位與
5 ^ 按位異或
4 | 按位或
3 && 按位與
2 || 按位或
1 =,+=,-=,*=,/=,%=, 賦值,運算且賦值
&=,^=,|=,<<=,>>=
較高運算級別的運算符先於低級別的運算符進行求值運算