天天看點

2、權限、變量、for 學習筆記

ls 顯示目錄内容,不包含以點開頭的檔案

ls -a           顯示目錄内容,包含以點開頭的檔案

ls -l 長格式顯示目錄内容

ls -d 顯示目錄自身的資訊,通常與-l同時使用

ls -r 逆序顯示目錄内容

ls -R 遞歸顯示目錄内容

ls -h 以易讀的方式顯示檔案大小,通常與-l同時使用

ls -i 顯示inode資訊

tree 樹狀形式顯示目錄内容

alias         顯示目前shell中定義的所有别名

alias 别名='原始指令' 定義别名

unalias 别名 删除指令别名

file FILE... 檢視檔案内容格式

cat -E FILE 顯示行結束符                    

cat -v FILE 顯示非列印字元                  

cat -e FILE 相當于-vE                      

cat -n FILE 顯示時給行按順序編号            

cat -s FILE 多個連續的空白行顯示為一個空白行

head -# 顯示檔案頂部#行的内容

tail -# 顯示檔案尾部#行的内容

tail -#f 動态顯示檔案尾部#行的内容

echo指令的用法:

echo -e "\033[##;##m string \033[0m"

第一個#: 3表示前景色,4表示背景色

第二個#:顔色,0-7

0 黑色

1 紅色

2 綠色

3 ×××

4 藍色

5 紫色

6 天藍

7 白色

echo -e "\033[31;42;5m LINUX \033[0m"

效果:綠底紅字閃爍

通配符:

* 比對任意長度的任意字元

? 比對任意單個字元

[] 比對指定字元範圍内的任意單個字元

[^] 比對指定字元範圍外的任意單個字元

[:upper:]]              所有大寫字母

[:lower:]] 所有小寫字母

[:alpha:]] 所有字母

[:digit:]] 0-9

[:alnum:]] 0-9及所有字母

[:space:]] 所有空白字元

[:punct:]] 所有标點符号

練習:複制/var目錄下所有以l開頭,以一個小寫字母結尾,且中間出現一位數字的檔案或目錄至/tmp下

cp -r /var/1*[0-9]*[a-z] /tmp

練習:如果符合條件是目錄,也要複制;

1、複制/etc目錄下以p開頭,中間跟了任意字元,并以d結尾的檔案至/tmp目錄中;

2、複制/etc/目錄下以p開頭,中間跟了4個任意字元,并以d結尾的檔案至/tmp/a目錄中;如果a不存在,先建立出來;

3、複制/etc/目錄下以任意一位數字開頭,并以非數字結尾的檔案至/tmp/b目錄中;

4、複制/etc/目錄下以非字母開頭,後面跟了一個字母及其它任何長度字元的檔案至/tmp/c目錄中;

1、cp -r /etc/p*d /tmp

2、cp -r /etc/p????d  /tmp/a

3、cp -r /etc/[0-9]*[^0-9] /tmp/b

4、cp -r /etc/[^[:alpha:]][[:alpha:]]* /tmp/c

cp指令的長用選項:

-r:遞歸

-d: 當源為連結檔案時,複制連結檔案本身而非指向的源檔案

-p: 保持原有屬性

mv: 移動檔案,或重命名

rm: 移除檔案

删除非空目錄:# rm -rf 

stat FILE 顯示檔案或檔案系統資訊,包含(access、modify、change時間)

touch FILE 建立空檔案或修改檔案時間資訊

-c: 不建立空檔案

-a: 僅修改通路時間

-m: 僅修改修改時間

-t STAMP: [CC]YYMMDDhhmm.ss 修改目前時間

/etc/passwd:

使用者名:x:UID:基本組ID:comment資訊:HOME:預設shell

useradd: adduser

-u UID:指定UID

-g GID: 指定GID,即指定使用者的基本組,但GID要事先存在

-G GID:指定使用者的額外組,組要事先存在;

-c "Comment": 

-d /path/to/somewhre: 

-s /path/to/shell: 指定預設shell,應該指定使用/etc/shells檔案中出現的shell;

-m: 建立使用者時,強制給使用者建立家目錄;

-M: 建立使用者,但不建立家目錄;

-r: 建立系統使用者

id: 1-499

不會為使用者建立家目錄

預設shell為/sbin/nologin

groupadd GrpName

-g GID: 建立組并為其指定GID

使用者類别:

管理者:0

普通使用者:1-65535

系統使用者:1-499

登入使用者:500+

使用者組:

管理者組

普通組

以使用者為視角,組可為兩類:

基本組: 顯示在/etc/passwd中GID字段組,為使用者的基本組;

額外組,附加組: /etc/group

userdel: 删除使用者, 預設會保留家目錄

格式:userdel UserName

-r: 一并删除家目錄

設定使用者密碼: passwd

普通使用者:passwd

管理者:

改自己密碼:passwd

改其它使用者密碼:passwd UserName

/etc/shadow檔案的格式:

UserName:加密的密碼:最近一次密碼修改時間:最短使用期限:最長使用期限:警告區間:非活動區間:帳号的過期期限:預留段

passwd -l UserName 鎖使用者

passwd -u UserName 解鎖

設定組密碼:gpasswd GroupName

usermod: 

-u UID:

-g GID:

-G GID: 預設會覆寫原有的附加組;如果是添加,則同時使用-a選項; 

-c String: 

-d /path/to/New_Home: 預設不會遷移使用者的家目錄;如果要遷移,則同時使用-m

-s SHELL: 

-l New_login_name:

-L: 鎖定使用者帳号

-U: 解鎖

如何修改組屬性定義:

groupmod: 

-g GID

-n New_Group_Name: 

修改帳号日期屬性:chage

-m 修改最短使用期限。為零時代表任何時候都可以更改密碼

-M 修改最長使用期限。密碼保持有效的最大天數

-W 修改警告區間。使用者密碼到期前,提前收到警告資訊的天數

-I 修改非活動區間或停滞日期。如果一個密碼已過期這些天,那麼此帳号将不可用

-E 修改帳号的過期期限。過了這天,此帳号将不可用

檢視使用者相關資訊id:

id UserName

-u: 顯示UID,跟-n一起使用則顯示使用者名

-g: 顯示基本組ID,跟-n一起使用則顯示基本組名

-G: 顯示所有組ID,跟-n一起使用則顯示所有組名

su -l UserName 切換使用者,且切換到該使用者的家目錄

練習:

1、建立一個使用者mandriva,其ID号為2002,基本組為distro(組ID為3003),附加組為linux;

# groupadd linux

# groupadd -g 3003 distro

# useradd -u 2002 -g distro -G linux mandriva

2、建立一個使用者fedora,其全名為Fedora Community,預設shell為tcsh;

# useradd -c "Fedora Community" -s /bin/tcsh fedora

3、修改mandriva的ID号為4004,基本組為linux,附加組為distro和fedora;

# usermod -u 4004 -g linux -G distro,fedora mandriva

4、給fedora加密碼,并設定其密碼最短使用期限為2天,最長為50天;

# passwd fedora

# chage -m 2 -M 50 fedora

5、将mandriva的預設shell改為/bin/bash; 

# chsh -s /bin/bash mandriva

Linux檔案類型:

普通檔案 -

目錄 d

連結檔案 l

字元裝置 c

塊裝置 b

命名管道 p

套接字檔案         s

權限:read, write, execute

使用者不擁有某位權限,則使用 - 占位;

檔案:

r: 可以使用内容檢視類的指令來顯示其相關内容;

w: 可以使用編輯器修改其内容;

x: 可以将其發起一個程序;

目錄:

r: 可以使用ls指令檢視目錄内容的檔案資訊;

w: 可以建立、删除檔案;

x: 可以使用ls -l指令檢視目錄内容的檔案資訊,并且可用cd指令切換此目錄為工作目錄;

chmod指令:

操作三類使用者的權限:使用8進制形式

chmod [-R] OCTAL-MODE file...

-R可以遞歸修改目錄下檔案的權限

操作指定類别使用者的權限:使用u,g,o,a來賦權,基于=或+/-來進行

u: 屬主

g: 屬組

o: 其它

a: 所有

=:操作指定類别使用者的權限;u=, ug=,     u=,g=

+/-: 操作指定類别使用者的單個權限: u-x, g+r, o-x, +x

參照其它檔案的權限為當檔案賦權

--reference=要參照的檔案   要修改權限的檔案

umask

建立檔案:666-umask

檔案預設決不允許出現執行權限,如何具有執行權限,則權限值加1;

建立目錄:777-umask

root使用者的umask為022;使用者名和基本組組名一緻umask為002,否則umask為022;

修改檔案的屬主或屬組:chown, chgrp

-R: 遞歸

--reference=

chown [option] UserName[{:|.}GroupName] file...

權限應用模型:

程序的屬主,是否與檔案的屬主相同;如果相同,程序則以檔案屬主的權限來通路檔案;否則

程序的屬主所屬的組,是否其中之一與檔案的屬組相同;如果相同,程序則以檔案屬組的權限來通路檔案;否則,

程序則以檔案的其它使用者的權限來通路檔案;

1、建立一個使用者openstack,但不給其建立家目錄;建立完成後使用su指令切換至此使用者,檢視其指令提示符及PATH和HOME兩個環境變量的值;

# useradd -M openstack

# su - openstack

# echo $PATH $HOME

2、複制/etc/skel目錄為/home/openstack;

# cp -r /etc/skel /home/openstack

3、改變/home/openstack及其内部檔案的屬主屬組均為openstack;

# chown -R openstack.openstack /home/openstack

4、/home/openstack及其内部的檔案,屬組和其它使用者沒有任何通路權限;

# chmod -R go= /home/openstack

完成以下任務:

  (1)建立系統組mysql;建立系統使用者mysql,屬于mysql組,要求其沒有家目錄且shell為/sbin/nologin;

  # groupadd -r mysql

  # useradd -r -s /sbin/nologin -g mysql mysql

  (2)建立GID為600的組magedu;建立使用者gentoo,要求其家目錄為/users/gentoo,密碼同使用者名;

  # groupadd -g 600 magedu

  # mkdir /users

  # useradd -d /users/gentoo gentoo

  # passwd gentoo

  (3)建立使用者centos,其家目錄為/users/centos,密碼同使用者名;

  # useradd -d /users/centos centos

  # passwd centos

  (4)建立使用者www,其家目錄為/users/www;删除www使用者,但保留其家目錄;

  # useradd -d /users/www www

  # userdel www

  (5)使用者gentoo和centos均以magedu為其附加組;

  # usermod -a -G magedu gentoo

  # usermod -a -G magedu centos

bash特性之六:bash的快捷鍵

Ctrl+a: 跳至指令行首

Ctrl+e: 跳至指令行尾

Ctrl+u: 删除指令行首至目前光标所在處的内容

Ctrl+k: 删除目前光标所有處至指令行尾的内容

Ctrl+l: 清屏,相當于clear指令

Ctrl+c: 取消或終止;

Ctrl+z: 将目前指令送至背景,fg調回前台

ELF:

#!/bin/bash

程式=指令+資料

變量:

弱類型語言:

1、不強制區分變量的類型,無論存儲何種資料,均以字元格式進行;

2、無須事先聲明;用到時,直接使用,直接指派;

bash: 動态程式設計語言,是弱類型語言;

bash的特性之九:bash中的變量

變量的類型:

本地變量:隻對目前shell程序有效,對其子shell以及其它shell都無效;

定義變量: [set]Var_Name="Value"

引用變量: ${Var_Name}

撤銷變量: unset Var_Name

局部變量:僅對局部代碼生效

local Var_Name="Value"

環境變量:對目前shell程序及其子shell都有效;

export Var_Name="Value"

Var_Name="Value"

export Var_Name

位置變量:

$1, ..., $n

./first.sh 2 8

特殊變量:

$0: 腳本名稱自身

$?: 上一條指令的執行狀态;

狀态用數字來表示:0-255;

0: 成功

1-255: 失敗

$$

$!

$# 位置參數的個數

$* 所有的位置參數

變量的命名要求:

隻能使用數字、字母和下劃線組成;

不能以數字開頭;

不能使用程式中的關鍵字;

見名知義;totalWeight 

set

環境變量:用來bash的工作特性,用于儲存目前會話的屬性資訊;

顯示所有環境變量:export, env, printenv

定義:export Var_Name="Value"

PATH, PS1

bash的配置檔案:持久儲存使用者配置

profile類:為互動式登入的使用者提供配置

/etc/profile:全局

/etc/profile.d/*.sh:全局

~/.bash_profile:個人配置,僅對目前使用者有效

功能:

設定環境變量

運作指令或腳本

bashrc類:非互動工登入使用者提供配置

/etc/bashrc: 全局

~/.bashrc: 個人配置

功用:

設定本地變量

定義指令别名

登入類型:

互動式登入:

直接通過終端輸入使用者資訊登入系統;

su - UserName或su -l UserName;

非互動式登入:

su UserName

圖形界面的終端

執行腳本

新增配置的生效方式:

通知shell重讀配置檔案的指令:

source (.)

. FILE

重新登入

互動式登入使用者:

/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非互動式登入使用者:

~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

bash腳本:面向過程的程式設計中

順序執行:預設法則,逐條執行各語句

選擇執行:分支,條件判斷,符合條件的分支予以執行;

循環執行:将同一段代碼反複執行有限次,是以,循環必須有退出條件,否則将陷入死循環;

for循環:

for var_Name in 清單; do

語句1

語句2

...

done

文法錯誤檢測:

# bash -n 腳本檔案

清單的生成方法:

生成數字序列:{start..end}、seq [start] [step] end

練習:寫一個腳本,列出1-10的奇數

#!/bin/bash             

for num in `seq 1 2 10`;

do                      

        echo $num       

done                    

練習:寫一個腳本,用file指令顯示/var/log目錄下每個檔案的内容類型;

提示:清單生成的方法為/var/log/*

#

dirName=/var/log

for fileName in $dirName/*; do

file $fileName

done 

練習:寫一個腳本,

1、建立/tmp/scripttest目錄,用變量儲存目錄名;

2、在目錄裡建立測試檔案tfile1-tfile20;

3、建立使用者testuser1和testuser2; 

4、将tfile1-tfile10的屬主和屬組改為testuser1;

5、将tfile11-tfile20的屬主和屬組改為testuser2;

dirName=/tmp/scripttest

mkdir $dirName

for fileNo in {1..20}; do

touch $dirName/tfile$fileNo

echo "Create $dirName/tfile$fileNo finished"

useradd testuser1

useradd testuser2

for fileNo in {1..10}; do

chown testuser1:testuser1 $dirName/tfile$fileNo

for fileNo in {11..20}; do

chown testuser2:testuser2 $dirName/tfile$fileNo

文本處理類的指令:wc, word count

wc [option] [file]...

-l: 統計行數

-c: 統計位元組數

-w;統計單詞數

tr: 轉換字元或删除字元

tr '集合1' '集合2'   将集合1替換為集合2

tr -d '字元集合' 删除字元集合

cut -d字元 -f# 操作對象

-d字元:指定分隔符

-f#: 指定要顯示字段

單個數字:一個字段

逗号分隔的多個數字:指定多個離散字段

-:連續字段,如3-5;

sort: 預設按字元進行比較

sort [option] file...

-f: 忽略字元大小寫;

-n: 比較數值大小;

-u: 重複的行,隻顯示一次;

-t: 指定分隔符

-k: 指定分隔後進行比較字段

uniq: 移除重複的行

-c:顯示每行重複的次數

-d:僅顯示重複過的行

-u: 僅顯示不曾重複的行

1、統計/bin、/usr/bin、/sbin和/usr/sbin等各目錄中的檔案個數;

# ls /bin | wc -l

2、顯示目前系統上所有使用者的shell,要求,每種shell隻顯示一次;

# cut -d: -f7 /etc/passwd | sort -u

3、取出/etc/passwd檔案的第7行;

# head -7 /etc/passwd | tail -1

4、顯示第3題中取出的第7行的使用者名;

# head -7 /etc/passwd | tail -1 | cut -d: -f1

# head -7 /etc/passwd | tail -1 | cut -d: -f1 | tr 'a-z' 'A-Z'

5、統計/etc目錄下以P或p開頭的檔案個數;

# ls -d /etc/[Pp]* | wc -l

練習:寫一個腳本,用for循環實作

顯示/etc/init.d/functions、/etc/rc.d/rc.sysinit和/etc/fstab各有多少行;

for fileName in /etc/init.d/functions /etc/rc.d/rc.sysinit /etc/fstab; do

wc -l $fileName

lineCount=`wc -l $fileName | cut -d' ' -f1`

echo "$fileName: $lineCount lines."

echo "$fileName: `wc -l $fileName | cut -d' ' -f1` lines."

練習:寫一個腳本

将上一題中三個檔案的複制到/tmp目錄中;

用for循環實作,分别将每個檔案的最近一次的修改時間改為2011年9月15号13點27分;

cp $fileName /tmp

baseName=`basename $fileName`

touch -m -t 201109151327 /tmp/$baseName

顯示/etc/passwd中第3、7和11個使用者的使用者名和ID号;

for lineNo in 3 7 11; do

userInfo=`head -n $lineNo /etc/passwd | tail -1 | cut -d: -f1,3`

echo -e "User: `echo $userInfo | cut -d: -f1`\nUid: `echo $userInfo |cut -d: -f2`"

for:通過使用一個變量去周遊給定清單中的每個元素,在每次變量指派時執行一次循環體,直至指派完成所有元素退出循環;

總結:生成清單的方式

1、直接給出清單;

2、使用檔案名通配的機制生成清單

3、可以使用{}或seq指令生成數字序列  1, $lineCount   `seq 1 $lineCount`  {1..$lineCount}

4、使用指令生成