Unix & Linux shell學習筆記
第一章 檔案安全與許可權
檔案
目錄
setuid
chown
chgrp
umask
suid
guid
粘滯位
suid —> -rwSrwxr–
guid —> -rwxrwSr–
t —> -rwxrwxr-T
suid: 執行此檔案時具有此檔案owner的許可權
guid: 執行此檔案時具有此檔案group的許可權
t: 若出現在目錄上,只有目錄的owner才能刪除;若出現在檔案上,執行時會被放在交換區。
chmod u+s xxx.txt
chmod g+s xxx.txt
chmod +t xxx.txt
4個8進位制數中的第一個:1代表T, 2代表guid,3代表suid
第二章 find和xargs
xargs可防止引數列表溢位。
xargs是一個命令。
Buid and excute command lines from standard inputs.
find:
忽略某目錄:-prune -o -print
cpio命令:向磁帶中備份檔案或從中恢復檔案。
第三章 後臺執行命令的方法
cron
crontab
at
&
nohup
ctrl-z
bg
fg
jobs
第四章 模式匹配
萬用字元:
*
?
[…]
[!…]
第五章 shell輸入輸出
echo
read
cat
管道: |
tee: xx.sh | tee xx.log
0:標準輸入
1:標準輸出
2:標準錯誤輸出
六 命令執行順序
&&
||
(cmd1; cmd2; cmd3; …) 在當前shell中執行這些command
{cmd1; cmd2; cmd3; …} 在子shell中執行這些命令
七 正則表示式
BRE: 標準正則表示式
ERE: 擴充套件正則表示式
^ 行首
$ 行尾
. 單字元
* 重複單字元
[] 範圍
\ 轉義
pattern{n} 重複n次
pattern{n,} 重複n次以上
pattern{n,m} 重複n~m次
八 grep
grep、egrep、fgrep
九 awk
略
十 sed
略
十一
sort
uniq
join
cut
past
split
十二
tr的用法
十三 登陸
步驟:
1. /etc/passwd
2. /etc/profile
3. ~/.profile
/etc/passwd
冒號分隔的七個域,分別為登入名、密碼、。。。
第5域為使用者全名,第6域為使用者根目錄,第7域為使用者登入的shell
登陸時先後執行 /etc/profile 和 ~/.profile, 登出時執行 ~/.logout
十四 環境和變數
引用變數時最好用花括號括起來,${variabl}
設定變數的方法:
=
+
:?
?
:=
:-
unset 清除變數
set 顯示本地變數
${val:-value} 測試val是否已設定,若val已試著則使用val,否則使用value
readonly 設定某變數為只讀。
環境變數
- 通常全大寫
- unset可清除指定的環境變數
- shell中的環境變數:CDPATH, EXINIT, HOME, IFS, LOGNAME, MAIL, MAILCHECK, MAILPATH, PATH, PS1, PS2, SHELL, TERMINFO, TERM, TZ, CDITOR, PWD, PAGER, MANPATH, LPDEST/PRINTER
- set -a 匯出所有變數
- export 匯出指定變數
- 位置變數:
$0,$1,$2, ...,$9
- 特性變數:
$#, $*, $$, $!, [email protected], $-, $?
- 引號:雙引號,單引號, 反引號
- 雙引號中不能直接放
$ ` \
其他字元都可以。 - 單引號,shell會忽略其中的任何引用值。
- 反引號,用於設定系統命令的輸出到變數。shell將反引號中的內容作為系統命令。
- 反斜線(反斜槓)遮蔽特殊意義的字元。特殊意義的字元:
& * + ^ \$ ` " | ?
- 表示式,expr
- echo -e,可以使用\n, \r, \c等。
十六 指令碼
\#!/bin/bash
十七 條件測試
test兩種格式:
test condition
[ condition ]
測試檔案狀態:
-d
-f
-L
-r
-s
-w
-u
-x
-a 與
-o 或
! 非
= 字串相等
!=不等
-z 空
-n 非空
數值測試:
-eq
-ne
-gt
-lt
-le
-ge
例:[ “$Number” -eq “130” ]
expr:
expr 10+10
expr 10 \* 10
Loop=`expr $Loop + 1`
expr xx + 1
echo $?
十八 控制流程
退出狀態
#?
exit n
$$
||
控制流程
分支:
if then else fi
case
迴圈:
for
until
while
1.變數值測試
if [ "$NAME" = "" ]
2.grep輸出檢查
if [ grep 'Dave' data.file > /dev/null 2>&1 ]
3.用grep測試變數
if [ echo $list | grep "peter" > /dev/null 2>&1 ]
4.測試檔案拷貝
if [ cp file file.bak ]
5.當前目錄測試
if [ `pwd` != "/" ]
6.檔案許可權測試
if [ ! -w "$LogFile" ]
7.測試傳遞到指令碼的引數
if [ $# -lt 3 ]
8.測試指令碼是互動模式還是非互動模式(cron或at)
if [ -t ]
9.變數是否已經設定
if [ -z $EDITOR ]
10.檢查執行指令碼的使用者
if [ $LOGNAME != "root" ]
LOGNAME是環境變數
11.空命令 “ : ”(冒號)
12.elif
case的用法
case $xxx
xx) xxxx
;;
yy) yyyy
;;
*) ****
;;
esac
for的用法
for 變數名 in 列表
1. for loop in 1 2 3 4 5
2. for loop in "orange red blue grey"
3. for loop in `ls`
4. for params in "[email protected]"
5. for params in "$*"
省去in列表項是時,它將接受命令列位置引數作為引數
for params
do
echo $params
done
until的用法
until [ condition ]
do
xxx
done
while的用法
while [ xxx ]
do
xxx
done
例:
while [ "$count" -lt "50" ]
do
count=`expr $count + 1`
done
while read FILM
do
echo $FILM
done
while read LINE
do
echo $LINE
done < xxx.txt <---- 從檔案讀取
分隔符IFS:
預設的分隔符是空格。
可以臨時改變分隔符。
SAVEDIFS=$IFS
IFS=:
xxx
IFS=$SAVEDIFS
十九 函式
定義三種方法:
函式名()
{
xxx
}
函式名(){
xxx
}
function 函式名(){
xxx
}
向函式傳遞引數:
1.呼叫函式時,將引數寫在函式名後面
2.在函式中用$0 $1 $2...
引用引數
從函式中返回:
return
return 1
return 0
使用函式:
收集一些常用函式,將它們放在檔案中,檔案開頭要有#!/bin/sh
,檔名任意。使用source或 . 將函式載入當前shell。
其實載入的不僅僅是函式,也包含變數。
檢查載入的函式: set
清除函式:unset
修改函式:unset —> 修改 —> 重新載入
在指令碼中使用函式:直接通過函式名呼叫。
二十 向指令碼傳遞引數
shift
每次將引數位置向左偏移一個位置,同時也改變$#
shift n
:向左偏移n個位置
shift `expr $#-2`
:移到最後一個引數
getopts
while getopts ahfgv OPTION
do
case $OPTION in
a)
;;
h)
;;
......
done