續前“Linux學習筆記(7~12)”
13、bash腳本編程字符串測試及for循環
- bc<<<" "
- for循環
- 求1-100的和
- for 變量 in 列表; do
- 循環體
- done
- for 變量 in 列表; do
- 生成列表:`seq [起始數] [ 步進數] 結束數`
- declare -i sum=0:聲明sum爲一個整型( let sum =0) [-x],聲明爲環境變量
- for i in `seq 1 $Lines`;do echo "Hello,`head -n $i /etc/passwd | tail -1 | cut -d: -f1`";done:向每個用戶問好,
- 求1-100的和
14、vi:Visual Interfacee
- vim:VI iMproved,語法着色,
- 全屏編輯器,模式化編輯器。
- # vim /path/to/somefile
- 文件可以不存在,目錄必須存在
- 打開文件
- # vim +行數 filename:定位到某行
- # vim + filename:定位到文件末尾
- # vim +/pattern:打開文件並定位到第一次被模式匹配到的行的行首
- vim
- vim模式
- 編輯模式(命令模式):默認狀態
- 輸入模式:輸入到文件中的字符
- 末行模式:文件管理類的命令
- 模式轉換
- 編輯-->輸入:
- i:在當前光標所在的字符前轉換爲輸入模式。
- a:在當前 字符後轉換爲輸入模式。
- o:在當前光標所在行下新建一行並轉換爲輸入模式
- I:當前光標所在行的行首轉換爲輸入模式
- A:當前光標所在行的行尾轉換爲輸入模式
- O:在當前光標所在行上新建一行並轉換爲輸入模式
- 輸入-->編輯
- ESC
- 編輯-->末行
- 輸入 :
- 末行模式下
- 10d:刪除第10行
- 10,20d:刪除第10--20行
- set nu:顯示行號,set nonu取消顯示行號
- !sh命令:
- 末行-->編輯
- ESC,ESC
- 編輯-->輸入:
- vim模式
- 關閉文件
- 末行下:鍵入w保存,q退出而不保存,wq保存並且退出,q!不保存並且退出,w!強行保存,wq==x保存退出
- 編輯模式下:ZZ保存退出
- 移動光標
- 逐字符移動:hljk對應左右下上。
- 移動指定數字的字符:編輯模式 數字h
- 逐單詞移動:w移到下一個單詞的詞首,e跳到當前或下個單詞詞尾,b跳到當前或前一個單詞的詞首,數字w 一次跳多個單詞
- 行內跳轉:0跳到行首(絕對),^跳到行首(第一個非空白字符),$行尾
- 行間跳轉:數字G,直接跳到某行,G最後一行,末行模式下直接輸入行號回車即可
- 翻屏:CTRL+F,CTRL+L,向下,上翻一屏,CTRL+d,u 向下,上翻半屏。
- 刪除d
- 單個字符:x,數字x 刪除光標所在處(向後)的字符
- d命令:d$,刪到行尾部,d0,刪除到行首,dw,逐單詞刪除,數字d跳轉符 dw de db dd(刪行,刪除當前光標所在行)
- 末行模式下,10,20d,刪除第10到20行,.,+5d 從當前行開始再向下五行,.,100d從當前行到第100行
- 最後一行$,向下n行+n,
- vim最近修改的內容可以撤銷
- 粘貼p
- p,小寫,刪除或複製的爲整行,粘貼至下方,否則,粘貼至光標所在字符後面
- P,大寫,刪除或複製的爲整行,粘貼至上方,否則,粘貼至光標所在字符前面
- 複製y
- 用法同d,yy複製一行,y0,.,+3y
- 修改c,先刪除內容再轉換爲輸入模式
- 用法同d,cc刪除整行並轉換爲輸入模式,...
- 替換r
- r,字符,將r處字符替換
- R,進入替換模式,
- 撤銷編輯u
- u:undo撤銷,撤銷前一次操作,可多次使用,連續u,撤銷n次(最多50)
- 數字u:撤銷最近多次操作。
- 撤銷撤銷
- CTRL+r:撤銷剛纔的撤銷操作,還原最近一次撤銷操作。
- 重複前一次編輯操作
- . 點命令,
- 可視化模式
- v :按字符選取
- V:按矩形塊兒選取
- 查找
- /pattern:全文
- ?pattern:從光標到文首
- n:下一個
- N:上一個
- 支持正則
- 查找並替換
- 末行模式下s命令:addr1,addr2s@pattern@string@g|i 同sed
- 1,$:同%,表示全文
- 替換實例:%s/paern/string/g 全文將pattern替換爲string,有/ 需要寫爲\/ ,pattern中的. 需要轉義。
- 如何使用vim打開多個文件
- 複製粘貼可以跨文件,
- 末行下:next,prev上下切換文件,last,first最後第一個文件
- vim file1 file2 file3:同時打開多個文件
- 退出::qa退出所有文件
- 分屏顯示一個文件
- 窗口拆分,CTRL+w,s水平拆分窗口,CTRL+w,箭頭 切換 CTRL+w,v垂直切分窗口
- 分窗口顯示多個文件
- -o:水平分隔顯示
- -O:垂直分隔顯示
- 將當前文件的部分內容另存爲另外一個文件
- :w
- :addr1,addr2w /path/to/file
- 將另外一個文件的內容填充在當前文件中
- :r path/to/somefile在光標下方粘貼
- 與shell交互
- :!command
- 高級
- :set nu,:set nonu行號
- :set ic顯示忽略大小寫,:set noic
- 設置自動縮進 :set autoindent
- 搜索文本,背景不高亮 :set nohlsearch
- 開啓語法高亮 :syntax on
- 非正常退出文本,再次打開報錯
- 配置文件
- /etc/vimrc:全局
- ~/.vimrc:用戶
- 在於用,不在於記憶:# vimtutor vim課程
- 腳本
- #!/bin/bash
- #
- for I in {1..10};do
- if id user$I&>/dev/null;then
- echo "user$I exist."
- else
- useradd user$I &>/dev/null
- echo "user$I" | passwd --stdin user$I &> /dev/null
- echo "add user$I success!"
- fi
- done
- 三種測試
- 整數測試
- le, lt ,ge, gt, eq, ne
- 字符測試
- == != > < n z
- 文件測試
- e f d r w x
- 組合測試條件
- -a:與 也可 [ ] && [ ]
- -o:或
- !:非
- 取反滿足摩根定律
- 整數測試
- 腳本運算
- let I=$[$I+1]
- let sum+=$I 加等,其他類比
- let I++
15、文件查找
- lacate
- 非實時,模糊,根據全系統文件數據庫完成:
- locate filename
- 手動更新數據庫:updatedb
- 安裝:mlocate
- find
- 實時,精確,速度慢,遍歷指定目錄中所有文件,支持多種查找標準
- find 查找路徑==當前 查找標準==指定路徑下所有 找到以後的動作==打印到屏幕
- 查找標準
- -name ‘filename’,且filename支持正則表達式
- -iname ‘filename’,文件名匹配不區分大小寫
- -regex pattern,基於正則表達式進行文件名匹配
- -user username ,基於屬主進行查詢
- -group groupname
- -uid uid,用戶刪除後,其文件顯示屬主爲原先id
- -nouser,查找無屬主的文件
- -nogroup,查找無屬組的文件
- -type filetype
- f:普通文件
- d:目錄
- c:字符設備
- b:塊設備
- l:鏈接
- p:管道
- s:套接字設備
- -size 【+,-】數字【k,m,g】
- 訪問時間
- -mtime
- -ctime
- -atime
- [+ | - ] 天數
- -mmin
- -cmin
- -amin
- -perm mode(644):根據權限
- -mode:對應位完全包含即可顯示
- /mode:只要有一位匹配即可顯示
- mode:精確匹配
- 動作
- 默認爲-print
- -ls:類似ls -l,顯示匹配到的文件的信息
- -ok command {} \; {}爲文件名稱佔位符,每一個操作都需要用戶確認
- -exec:同-ok ,但操作不需要用戶確認
- -xargs:從標準輸入接收並執行find ... | xargs echo {} >> /tmp/jj.txt
- 組合條件
- -a:默認選項
- -o
- -not
16、特殊權限
- SUID
- 無論哪個用戶啓動文件,該文件的屬主是程序文件自身的屬主,而不是啓動者。
- 賦予SUID:chmod u+s file,原有x,則爲s,否則顯示爲S。
- 擁有suid,則任何用戶啓動文件,以文件所有者的權限執行。
- SGID
- 無論哪個用戶啓動文件,該文件的屬組是程序文件自身的屬主,而不是啓動者所屬的基本組。
- chmod g+s file,
- 目錄擁有sgid,在目錄下建立的文件,文件的基本組不再是用戶的基本組,而是目錄的基本組
- 測試執行順序
- 添加用戶:useradd user1
- 添加基本組:groupadd develop
- 改目錄屬組:chmod g+w /tmp/project/
- 目錄屬組添加sgid: chmod g+s /tmp/project/
- 將用戶附加組改爲與目錄相同:usermod -a -G develop user2
- 此後,user2在/tmp/project下間的新文件,屬組爲develop,若無sgid,間的文件屬組爲用戶基本組,
- Sticky:在一個公共目錄,每個用戶均可創建文件,刪除自己的文件,但不可以刪除別人的文件
- chmod o+t dir
- 000---111:SUID,SGID,Sticky。
- chmod 1755 file : 1代表Sticky,3755,3代表011,SGID和Sticky
- umask爲四位,第一位爲特殊權限,
17、facl及用戶及Linux終端
- FACL:filesystem access control list
- 利用文件擴展保存額外的訪問控制權限
- mask,額外的用戶(組)給的權限不會超過mask,
- setfacl:設置facl
- -m:設定
- u:UID:perm
- setfacl -m u:Hadoop:rw filename
- setfacl -m d:u:Hadoop:rw filename 爲目錄設置默認的訪問控制列表
- g:GID:perm
- setfact -m g:mygroup:rw filename
- u:UID:perm
- -x:取消設定
- setface -x u:Hadoop filename
- --mask:
- -m:設定
- getfacl:查看facl
- 檢查順序(權限應用次序)
- owner-->facl,user-->group-->facl,group-->other
- 幾個命令
- whoami:查看當前登陸的用戶
- who:顯示當前登陸到系統上的用戶
- 終端類型
- 控制檯:console,直接連到主機上的物理設備,不屬於終端,
- pty:物理終端,相當於控制檯,VGA
- tty#:虛擬控制檯,通常是在本地,虛擬終端,VGA
- ttys#:串行終端
- pts/#:僞終端,ssh
- -r:顯示當前運行級別
- -H:顯示頭部
- -r:顯示當前運行級別及上次運行級別
- 每隔5秒,查看user1是否登陸,如登陸,顯示
- sleep
- 終端類型
- w:顯示登陸用戶以及what
- last:顯示登陸日誌 /var/log/wtmp文件,登陸歷史以及重啓歷史
- -n:僅顯示最近n次
- lastb:顯示/var/log/btmp文件,顯示用戶錯誤的登陸嘗試
- -n
- lastlog:顯示每個用戶上一次成功登陸時間
- -u username
- basename:顯示路徑的基名(文件名)
- basename $0:執行腳本時的腳本路徑及名稱
- mail:
- -s:指定 subject
- # cat /etc/fstab | mail -s "how are you" root 管道命令
- # mail -s "how are you" root < /etc/fstab 輸入重定向
- hostname:顯示主機名(實時的,非環境變量$HOSTNAME)
- RANDOM:生成隨機數,0-32768
- echo $RANDOM
- 隨機數生成器:/dev/random,熵池,會被取空,
- /dev/urandom,不會取空,軟件模擬生成,
18、bash腳本編程之case語句與腳本選項進階
面向過程
- 控制結構
- 順序
- 選擇
- if:單分支,雙分支,多分支
- case語句
- case SWITCH in
- value 1)
- statement
- ;;
- esac
- 循環
19、磁盤管理
- 機械式硬盤
- RAM:易失
- 分區:partition
- 文件系統
- MBR:master boot record 主引導分區
- 主引導記錄
- 屬於磁盤,512byte
- 446byte:bootLoader,程序,
- 64byte:每16標識一個分區
- 2byte:魔數 magic number 標記mbr是否有效。
- 真空避灰塵
- metadate
- 文件系統
- 元數據存儲區
- 塊位圖:bitmap
- inode:索引節點
- 硬鏈接:不同文件名指向同一個文件塊兒,指向同一個inode,# ln 源文件 目標文件,不能爲文件夾創建,增加被硬鏈接的次數
- 符號鏈接,軟鏈接:存儲另一個文件的路徑,大小爲路徑字符數,# ln -s 源文件 目標文件,可應用於目錄,只保留路徑的字符。
- 本文件被硬鏈接的次數:防止一個文件被多個文件鏈接,誤刪。
- # du
- -s:顯示每一個的大小
- -h:人性化
- # df
- 顯示磁盤分區使用情況
- -h
- -P
- 設備文件
- b:按塊爲單位,隨機訪問的設備
- 硬盤
- c:按字符爲單位,線性設備
- 鍵盤
- /dev
- 主設備號:標識設備類型
- 次設備號:標識同一設備類型的不同設備
- # mknod 創建設備文件
- mknod mydev c 66 0
- -m 指定權限
- # tty
- 查看當前終端設備
- echo “hello” >> /dev/pts/1
- 硬盤設備的設備文件名
- IDE,ATA:hd
- a,b,c....來區別同一類型下的不同設備
- /dev/hda /dev/hdb
- 分區:hda1,hda2,...had4 邏輯分區從hda5開始
- 查看當前設備磁盤及其分區# fdisk -l
- 管理磁盤分區fdisk
- SATA,SCSI,USB:sd
- IDE,ATA:hd
- b:按塊爲單位,隨機訪問的設備
- 格式化
- 低級格式化:廠商完成
- 高級格式化:創建文件系統# mkfs -t ext3
- 文件系統類型
- 管理方式不同
- /,/usr,/var,/tmp
- 只有/可以自引用。普天之下莫非王土,率土之濱莫非王臣。
- fdisk
- # fdisk /dev/sda 打開交互式界面
- p:顯示當前硬盤的分區,包括沒保存的
- n:創建新分區
- e:擴展
- p:主分區
- d:刪除一個分區
- w:保存退出
- q:不保存退出
- t:修改分區類型
- l(L):顯示支持的所有類型
- # partprobe 5.x
- 通知內核重讀硬盤分區表
- /proc/partitions
- # fdisk /dev/sda 打開交互式界面
- VFS
- 虛擬文件系統,對應內核,沙漏模型。
- 塊大小:block size
- 1024,2048,4096
- 位圖,bitmap
- 加快數據查找速度
- super block
- boot block每個分區都有,引導操作系統,
- index node:inode
- mkfs
- -t:fstype,
- # mke2fs:專門管理ext系列文件
- -j :創建ext3類型的文件
- -b BLOCK_SIZE:指定塊兒大小,默認4096,,1024,2048
- -L LABEL:指定分區卷標
- -m #:指定預留給超級用戶的塊數百分比
- -i # :指定爲# 個字節指定一個inode,默認8192
- blkid 設備名
- 查詢或查看磁盤設備的相關屬性
- # e2label 設備:查看或設置卷標
- # tune2fs -j 設備名
- 不損害文件,調整文件系統類型(ext2-->ext3)
- -L:設定或修改卷標
- -m # :調整預留百分比
- -r #:指定預留塊兒數
- -o acl:指定默認掛載選項
- -c # 指定掛載次數達到# 次後自檢,0或-1關閉
- -i # 指定掛載# 天后進行自檢,0或-1關閉
- -l:顯示超級塊兒的信息
- # dumpe2fs:顯示文件屬性信息,更加詳細
- -h:只顯示超級塊兒信息
- # dumpe2fs:顯示文件屬性信息,更加詳細
20、壓縮及歸檔
- 壓縮格式:gz,bz2,xz,zip,Z
- 壓縮算法
- 壓縮命令
- compress,uncompress
- gzip:.gz
- 默認會刪除原文件
- -d:解壓縮
- gunzip:解壓縮,完成後刪除原文件
- -# :指定壓縮比,1-9,默認6
- zcat:臨時查看壓縮文件的內容
- bzip2:.bz2
- 比gzip壓縮比大,使用格式類似。
- -k:壓縮時保留原文件
- -d:解壓縮
- bunzip2
- bzcat:臨時查看壓縮文件的內容
- xz:.xz
- 壓縮比更大
- -d:解壓縮
- xzdec:解壓縮到屏幕
- unxz
- xzcat
- archive:歸檔
- zip:可以壓縮目錄,既歸檔又壓縮
- # zip 目的.zip 源..... 壓縮後不刪除源文件
- unzip:
- tar:只歸檔不壓縮
- -c:創建歸檔文件
- -f file.tar:操作的歸檔文件
- # tar -cf test.tar test*
- -x:展開歸檔
- --xattrs:歸檔時,保留文件的擴展屬性信息
- -t:不展開tar,查看歸檔了哪些文件
- -zcf:既歸檔又壓縮(gzip)
- -zxf:解壓(gzip)及展開歸檔
- -jcf:bzip2
- -jxf:
- -Jcf:xz
- -Jxf:
- zip:可以壓縮目錄,既歸檔又壓縮
- cpio:歸檔工具,與tar類似
- read NAME。。。:交互式,給NAME賦值
- -p “PROMPT”:給出提示,
- -t #:超時
- 腳本編程:while循環
- 適用於循環次數未知的場景
- while [ CONDITION ]; do
- statement 。。。
- done