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、使用指令生成