1. 程式人生 > >Unix & Linux shell學習筆記

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 設定某變數為只讀。

環境變數

  1. 通常全大寫
  2. unset可清除指定的環境變數
  3. shell中的環境變數:CDPATH, EXINIT, HOME, IFS, LOGNAME, MAIL, MAILCHECK, MAILPATH, PATH, PS1, PS2, SHELL, TERMINFO, TERM, TZ, CDITOR, PWD, PAGER, MANPATH, LPDEST/PRINTER
  4. set -a 匯出所有變數
  5. export 匯出指定變數
  6. 位置變數: $0,$1,$2, ...,$9
  7. 特性變數: $#, $*, $$, $!, [email protected], $-, $?
  8. 引號:雙引號,單引號, 反引號
  9. 雙引號中不能直接放$ ` \其他字元都可以。
  10. 單引號,shell會忽略其中的任何引用值。
  11. 反引號,用於設定系統命令的輸出到變數。shell將反引號中的內容作為系統命令。
  12. 反斜線(反斜槓)遮蔽特殊意義的字元。特殊意義的字元:& * + ^ \$ ` " | ?
  13. 表示式,expr
  14. 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