*********************************************************************
*1, 檔案及許可權
*********************************************************************
chmod who [operator] [permission] filename相對模式:
operator: +/-
permission:r,w,x,l(給檔案加鎖),s(設定檔案宿主或組set_ID),t(粘帖位)絕對模式:
許可權: r(2), w(4), x(1)
uid: owner(set_uid)(2), group(set_gid)(4), 粘帖位(1)
設定uid時把uid的絕對組合數字放在最前面umask:
允許設定檔案建立時的預設模式, 對每一類使用者存在相應的mask數字, 對於檔案
該值最大為6, 因為系統不允許在建立檔案時賦予執行許可權, 對於目錄來講最大
值為7, 例子:
(目錄) umask: 101 對應的許可權為676
*********************************************************************
*2, 檔案名稱替換
*********************************************************************
* 匹配任何字串
? 匹配單個字串
[...] 匹配其中的任何字元
[!...]匹配非!之後的字元*********************************************************************
*3, shell 的輸入與輸出
*********************************************************************
echo 輸出語句
read 變數1 變數2 ...
cat 用來顯示檔案 分割顯示檔案 顯示控制字元
tee 把一個副本傳遞到標準輸出同時也把另一個副本COPY到相應的檔案中shell 3個相關的檔案描述符:
0 標準輸入
1 標準輸出
2 標準錯誤檔案重新導向:
> 定向到檔案
>> 追加到檔案對標準錯誤重新導向時必須是檔案描述符:command 0/1/2 >/>> filename
command >/>> filename 0/1/2>&0/1/2command < filename
command << delimiter 從標準輸入中讀入直到遇到delimiter分界符
command <&m 把m作為標準輸入
command >&m 把標準輸出重新導向到m中去
command <&- 關閉標準輸入*********************************************************************
*4, shell 命令的執行順序
*********************************************************************
&& 如:命令1 && 命令2 只有命令1返回真(0),命令2才被執行
|| 如:命令1 || 命令2 如果命令1執行失敗, 則執行命令2
() 在當前shell執行一組命令, 如(命令1;命令2;...), 如用{}則組中所有的命令的輸出
作為一個整體被重新導向時,則放到子shell執行否則放到當前shell執行
*********************************************************************
*5, 文本過濾(Regex)
*********************************************************************
^ 匹配行首 如^c
$ 只匹配行尾 如$c
* 一個單字元後跟*, 匹配0或多個此字元
[] 匹配[]內字元, 可以是單字也可以是字元序列, 也可以使用-表示字元範圍,如[1-5]
\ 用來匹配一個元字元的特殊含義
. 匹配任意單字元
pattern\{n\} 匹配前面的pattern,n為次數
pattern\{n,\}m 同上但次數至少為n
patterb\{n,m\} 同上但次數在n與m之間*********************************************************************
*5, awk, 主要用來格式化文本
*********************************************************************
awk指令碼:
可以使用-F指定分割符, 如果未指定則使用空格模式和動作:
模式可以式任何語句, 模式包含BEGIN和END兩個欄位, 實際動作在{}內指定, 模式可
以省略域和記錄:
awk執行時其瀏覽域標識為$1,$2..., 使用$0表示使用所有域Regex:
除了grep的Regex之外,awk還支援另外兩個:
+ 匹配一個或多個字元
? 匹配模式出現頻率,如/XY?Z/匹配XYZ和XZ
運算式需要用斜線括起來條件操作符:
<, <=, ==,!=, >, >=, ~(匹配Regex), !~(不匹配Regex), 如:
awk '{if($4~/brown/) print $0}' grade.txt符合運算式:
&& 語句兩邊必須同時匹配為真
|| 語句兩邊必須有一個匹配為真
! 非內建變數:
ARGC 命令列參數個數
ARGV 命令列參數排列, 每個參數使用ARGV[n]訪問, 下標以0開始
ENVIRON 支援隊列中系統內容變數的使用, 如ENVIRON["PATH"] = "usr/local/bin"
FILENAME awk瀏覽的檔案名稱,
FNR 瀏覽檔案的記錄數
FS 設定輸入欄位分割符等價於-F選項
NF 瀏覽記錄的域個數
NR 已讀的記錄數
OFS 輸出域分割符, 預設為空白格
ORS 輸出記錄的分割符, 預設為\n
RS 記錄分割符號, 預設為\n
操作符:
=, +=, *=, /=, %=, ^=
? 條件運算式操作符
||, &&, !
~, !~
<,<=,==,!=,>,>=
+,-,*,/,%,^
++, --內建字串函數:
gsub(r,s), 在整個$0中用s替代r
gsub(r,s,t) 在整個t中用s替代r
index(s,t) 返回s中字串t的第一位置
length(s)
match(s,r) 測試s是否包含匹配r的字串
split(s,a,fs)在fs上將s分成序列a
sprintf(fmt,exp), 經格式化後的exp
sub(r,s) 用$0中最左邊最長的字串代替s
substr(s,p) 返回s中以p開始的部分
substr(s,p,n)輸出函數:
printf([格式控制符], 參數)
修飾符:
格式:
- 靠左對齊
.prec 最大字串長度或小數點右邊的位元
Width 域的步長, 用0表示0步長
格式符號:
%c 字元
%d
%e
%f
%g awk決定使用哪種浮點數轉換e或者f
%o 八位元
%s
%x 十六進位
awk數組:
使用數組前不必定義也不必指定數組元素的個數, 如:
'{split("123#224#245", myarrary, "#")}'
也可以先定義再使用.
*********************************************************************
*6, sed 文本過濾工具
*********************************************************************
sed [選項] sed命令 輸入檔案sed [選項] -f 指令檔 輸入檔案查詢方式:
sed預設從第一行開始
定位方式:
x 為一行號
x,y 行範圍
/pattern/ 查詢包含模式的行
/pattern/pattern/ 查詢包含兩個模式的行
/pattern/,x 在指定的行上查詢包含模式的行
x,/pattern/ 通過行號和模式查詢匹配行
x,y!查詢不包含指定行號x,y的行
命令:
p 列印匹配行
= 顯示檔案行號
a\ 在定位行號後附加新文本資訊
i\ 在定位行號號插入新文本資訊
d 刪除定位行
c\ 用新文本替換定位行
s 使用替換模式替換相應模式
r 從另一個檔案中讀文本
w 寫文本到一個檔案
q 第一個模式比對後退出
l 顯示與8進位ASCII代碼等價的控制字元
{} 在定位行執行的命令組
n 從另一個檔案中讀取下一行, 並附加在下一行
g 將模式2粘貼到/pattern n/
y 傳送字元
n 延續到下一輸入行, 允許跨行的模式比對語句
例子:
sed -n '2p' filename 第二行開始
sed -n '1,3p' filename 1~3行
sed -n '/pattern/p' filename
sed -n '4,/pattern/p'
sed -n '1,$p' filename 顯示整個檔案, $表示最後一行
sed -n '/pattern/=' 顯示行號
sed '/pattern/a\text' 附加文本,在指定行後面
sed '4i\text' 插入文本, 在指定行前面
sed '/pattern/c\text' 替換指定行
替換文本:
[address[,address]] s/pattern-to-find/replace-pattern/[g p w n]
g 預設只替換一次出現模式, 使用g替換全域所有模式
p 預設sed將所有被替換行寫入標準輸出,使用p將不列印結果
w 檔案名稱 將輸出定向到一個檔案
*********************************************************************
*7, 工具
*********************************************************************
tr 字元轉換刪除和替換
stty 設定終端特性*********************************************************************
*8, shell環境及變數
*********************************************************************
本地變數:
variable-name = value 設定實際值到變數
variable-name + value 如果設定了variable-name則重設其值
variable-name value 如果未設定variable-name 顯示未定義使用者錯誤資訊
variable-name ? value 如果未設定variable-name 顯示系統錯誤資訊
variable-name := value 如果未設定設定其值, 如果設定則使用原值
variable-namne :- value 如果未設定使用value替換但並不設定value到variable-name, 如果設定
則使用其值unset variable 清除變數
set variable value 設定變數 如果不提供參數則顯示所有本地變數測試變數是否設定值:
echo "The file is ${FILE?}"
echo "The file is ${FILE:? sorry ....}"設定唯讀變數:
readonly variable-name設定環境變數:
export variable-nameenv 顯示所有環境變數unset variable 清除環境變數預留的變數名:
CDPATH cd 一個目錄時尋找此變數
EXINIT 儲存VI初始化時的設定
HOME HOME目錄
LFS 用來指定shell預設的分割符
LOGNAME 儲存登陸名
MAIL 儲存郵箱路徑名
MAILCHECK 預設為每60秒檢查一次新郵件
MAILPATH 如果有多個郵箱要用到MAILPATH,此變數將覆蓋MAIL設定
PS1 shell提示符,預設對root為#, 其他使用者為$
PS2 shell附屬提示符, 預設為>, 用於執行超過一行的一個命令
SHELL 預設shell
TERMINFO 終端初始設定變數儲存終端初始化配置
TERM 終端類型
TZ 時區
EDITOR 預設的編輯器
PWD 當前路徑名
PAGER 螢幕翻頁命令
MANPATH man路徑
PRINTER 預設印表機名向指令碼傳遞參數, 用空格分割, $0~$9 其中$0始終儲存的指令碼名特定變數參數:
$# 傳遞到指令碼的參數個數
$* 以單個字元變數顯示所有傳遞的參數,此選項參數可以超過9個
$$ 當前指令碼進程的ID號
$! 後台啟動並執行最後一個進程的ID號
$@ 與$#相同但是使用時加引號
$- SHELL的當前選項,與set相同
$? 顯示命令的最後退出狀態, 0為沒錯誤, 其他任何值表示有錯誤*********************************************************************
*9, 引號
*********************************************************************
使用雙引號可以引用除字元$,反引號,\以外的任何字元
使用雙引號可以引用任何值
使用反引號用於將系統命令輸出到變數
反斜線引用特殊字元:&*+^$'""|?*********************************************************************
*10, 條件測試
**********************************************************************
測試檔案狀態:
test condition 或 [ condition ] 使用[]要在兩邊加上空格
-d 目錄
-f 正規檔案
-L 符號串連
-r 可讀
-s 檔案長度大於0非空
-w 可寫
-u 檔案具有suid位設定
-x 可執行
-e 存在
-b 塊檔案
-c 字元裝置檔案
-g 設定了guid位
...如: [ -f filename ]
echo $?
測試時使用邏輯操作:
-a 邏輯與 -o 邏輯或 !邏輯非, 如:
[ -w result.txt -a -w test.txt ]字串測試:
test "string"
test string_operator "string"
test "string" string_operator "string"string_operator:
= 相等
!= 不等
-z 空串
-n 非空串測試數值:
"number" number_operator "number"
或
[ "number" number_operator "number" ]
-eq 相等
-ne 不等
-gt 大於
-lt 小於
-le 小於等於
-ge 大於等於expr 用於數值計算:
exper argument operator argument**********************************************************************
*11, 控制流程結構
**********************************************************************
if-else:
if 條件1
then
命令1
elif 條件2
then
命令2
else
命令3
fi空命令永遠為真case 語句:
case 值 in
模式1)
命令1
...
;;
模式2)
命令2
...
;;
esacfor迴圈:
for 變數名 in 列表
do
命令1
命令2
...
doneuntil迴圈:
until 條件
do
命令1
命令2
...
donewhile 迴圈:
while 命令
do
命令1
命令2
...
done可以使用break continue 控制流程程, 對case及迴圈有效*********************************************************************
*12, shell 函數
*********************************************************************
格式:
函數名()
{
命令1
命令2
} 或
函數名() {
}也可以在函數名前面加上function參數傳遞:
和在shell中使用參數一樣如$1 ~ $9, 如:test() {
echo $1
echo $2
echo $3
}
調用: test 1 2 3函數返回:
return 返回用最後的命令狀態決定傳回值
return 0
return 1在shell中定位檔案:
定位格式為:
. pathname執行函數:
函數名 參數 ...刪除函數:
unset 函數名*********************************************************************
*13, 向指令碼傳遞參數
*********************************************************************
shift 命令:
他每執行一次參數個數減一且值向前移動一位,如:
while [ $# -ne 0 ]
do
echo $1
shift
done********************************************************************
*14, 建立螢幕輸出
********************************************************************
tput:
字元輸出:
bel 警鈴
blink 閃爍
bold 粗體
civis 隱藏游標
clear 清屏
cnorm 不隱藏游標
cup 移動游標位置到x,y
el 清除到行尾
ell 清除到行首
smso 啟動反白
rmso 正常顯示
smul 開始底線模式
rmul 停止底線模式
sc 儲存當前游標位置
rc 恢複游標位置
sgr0 正常螢幕
rev 逆轉視圖
數字輸出:
cols 列數目
it TAB設定寬度
lines 螢幕行數
布爾輸出:
chts 游標不可見
hs 具有狀態行
例子, 使用布爾輸出:
STATUS_LINE=`tput hs`
if $STATUS_LINE; then
echo "Your terminal has a status line"
else
echo "Your terminal don't has a status line"
fi
使用顏色:
前景色彩:
30(黑) 31(紅) 32(綠) 33(黃) 34(藍) 35(紫) 36(青) 37(白)
背景色:
40(黑) 41(紅) 42(綠) 43(黃) 44(藍) 45(紫) 46(青) 47(白)
顏色格式:
<ESCAPE>[background_number;foreground_number]m
例子:
echo -e "\033[40;32m"