指令碼檔案的學習與編寫以及字元擷取命令的學習
阿新 • • 發佈:2019-02-12
u盤只讀:
1 mount -o rw,remount /dev/sdb #/dev/sdb為u盤在電腦上的名稱,可用df進行檢視
2 umount /dev/sdb
3 df
4 mount /dev/sdb /mnt
5 cd /mnt
6 mv 檔案 /mnt
shell的瞭解:
shell也是作業系統中的一個軟體,它包含在linux核心的外面,為使用者和核心之間的互動提供了一個介面。
系統中的命令用shell去解釋shell接受系統迴應的輸出並顯示其到螢幕中
shell指令碼:
指令碼是一種解釋型語言,用shell指令碼儲存執行動作,用指令碼判定命令的執行條件,用指令碼來實現動作的批量執行
sh -x ip_show.sh #檢視指令碼報錯,+表示命令,命令下邊是報錯資訊,沒有就代表命令正確
+tail -n 1
+ifconfig
+head -n 2
.sh 為指令碼檔案
1.指令碼的書寫規則和執行
cd /mnt
vim ip_show.sh #編寫指令碼檔案
#!/bin/bash #幻數,使指令碼執行時先執行第一行的程式,必須寫,且不能寫錯
ifconfig eth0 | grep “inex ” #指令碼要執行的命令,顯示主機ip
sh ip_show.sh(/mnt/ip_show.sh) #執行指令碼檔案,兩種方式 vim /etc/vimrc
效果:
vim file.sh #快捷鍵的效果,編輯指令碼,按快捷鍵即可
vim file1.sh #腳本里會自動出現
2.diff 命令的使用(用來打補丁 )
vim westos
vim westos1
diff westos westos1 #比較兩個檔案的不同
diff -u westos westos1 > westos.path #比較兩個檔案的不同,並把不同的地方寫入補丁檔案中, .path為補丁檔案
cat westos.path #顯示補丁過程
yum install patch -y #下載補丁工具 patch -b westos westos.path #儲存原檔案內容 patch westos westos.path #對原檔案進行補丁 cat westos.orig #把儲存的檔案內容寫入到了此檔案中 cat westos
補充:比較兩個目錄的不同
mkdir linux
touch linux/file
mkdir unix
diff -r linux/ unix/
4.cut命令的使用(多用於字元擷取)
cut -d #指定分隔符
cut -f 1,7|1-7 #指定擷取的列,第一列和第七列|一到七列
cut -c 1,4|1-4 #指定擷取的字元位置
應用:執行指令碼檔案,使之只顯示自己的ip
cd /mnt
vim ip_show.sh
sh ip_show.sh
5.&& 與 || 的應用
&& #表示與
|| #表示或
應用:編輯一個指令碼使得,如果可以ping通,就輸出 $$1 up,如果不可以ping通,就輸出 $1 down,$1表示輸入的字元
cd /mnt
vim check_ip.sh
測試:
sh check_ip.sh 172.25.254.78
sh check_ip.sh 172.25.254.238
6.sort命令和uniq命令的使用(通常兩個聯合使用)
sort -n #純數字排序
sort -r #倒序
sort -u #去掉重複數字
sort -o #輸出到指定檔案中
sort -t #指定分隔符
sort -k #指定要排序的列
uniq -u #顯示唯一的行
uniq -d #顯示重複的行
uniq -c #每行顯示一次並統計重複次數
舉例:
vim westos
sort -n westos
sort -r westos
vim westos1
sort -n westos1 #如果有兩列的話,按照第一列進行排序
sort -t : -k 2 westos1 #以:為分隔符,對第二列進行排序
sort -urn westos1 #去掉重複數字進行倒序排序
sort -n westos | uniq -c #每行顯示一次並統計重複次數並排序
sort -n westos | uniq -d #顯示重複的行並進行排序
sort -n westos | uniq -u #顯示不重複的行並進行排序
應用:給/mnt下的檔案排序,並編寫指令碼檔案輸出最大的檔案
方法1:
ls -Sl /mnt #排序並顯示
ls -Sl /mnt/ | grep -v total #顯示且刪除顯示的第一行
ls -Sl /mnt/ | grep -v total | awk -F " " 'NR==1{print $9}' #輸出第九列,即檔名,awk報告生成器
方法2:
ls -l /mnt | grep total -v | awk -F " " '//{print $5,$9}' | sort -nr #排序並輸出第五列(大小)和第九列(檔名)
ls -l /mnt | grep total -v | awk -F " " '//{print $5,$9}' | sort -nr | head -n 1 #在上一個輸出的基礎上選擇輸出第一行
ls -l /mnt | grep total -v | awk -F " " '//{print $5,$9}' | sort -nr | head -n 1 | cut -d " " -f 2 #剪下檔名輸出
7.test命令的使用
test命令和 [] 等同
test "$1" == "s2" 等同 [ "$1" == "$2" ]
[ "$1" = "$2" ] #判斷$1是否等於$2
[ "$1" != "$2" ] #判斷$1是否不等於$2
[ "$1" -eq "$2" ] #判斷$1是否等於$2
[ "$1" -ne "$2" ] #判斷$1是否不等於$2
[ "$1" -le "$2" ] #判斷$1是否小於等於$2
[ "$1" -lt "$2" ] #判斷$1是否小於$2
[ "$1" -ge "$2" ] #判斷$1是否大於等於$2
[ "$1" -gt "$2" ] #判斷$1是大於$2
[ "$1" -ne "$2" -a "$1" -gt "$2" ] #判斷$1是否不等於且大於$2
[ "$1" -ne "$2" -o "$1" -gt "$2" ] #判斷$1是否不等於或者大於$2
[ -z "$2" ] #判斷$2是否為空
[ -n "$2" ] #判斷$2是否不為空
實驗:
編輯指令碼檔案,判斷輸入數字的大小是否小於10
vim num_check.sh #編寫指令碼檔案,執行命令更方便
sh num_check.sh 1
sh num_check.sh 23
sh num_check.sh
[ "file1" -ef "file2" ] #判斷file1是否與file2互為硬連結
[ "file1" -nt "file2" ] #判斷file1與file2哪個出現的晚
[ "file1" -ot "file2" ] #判斷file1與file2哪個出現的早
實驗:
touch file
ln /mnt/file /mnt/file1 #建立硬連結
ls -li /mnt #節點是否相同,即是否互為硬連結
[ "/mnt/file" -ef "/mnt/file1" ]&& echo yes || echo no #判斷/mnt/file和/mnt/file1互為硬連結
[ "/mnt/file" -ef "/etc/passwd" ]&& echo yes || echo no #判斷/mnt/file和/etc/passwd互為硬連結
[ -e "file2" ] #判斷檔案是否存在
[ -f "file2" ] #判斷檔案是否為普通檔案
[ -L "file2" ] #判斷檔案是否為軟連結
[ -S "file2" ] #判斷檔案是否為套接字
[ -b "file2" ] #判斷檔案是否為塊裝置
[ -d "file2" ] #判斷裝置是否為檔案
[ -c "file2" ] #判斷是否為字元裝置
實驗2:編輯一個指令碼檔案,判斷/mnt/file的檔案型別
vim file_check.sh
sh file_check.sh
sh file_check.sh file
sh file_check.sh /dev/vdb
sh file_check.sh /etc/system-release
8.tr(轉換) 命令的使用
vim test.sh
sh test.sh hello
sh test.sh HELLO #只是大小寫的區別,輸出結果就不同
用tr命令解決這個問題
tr 'a-z' 'A-Z' < test.sh
vim test.sh
sh test.sh hello
sh test.sh HELLO
寫一個指令碼:當輸入一個使用者時,當該使用者存在,則提示使用者已存在,當該使用者不存在時,則建立該使用者,並設定該使用者密碼
vim user_create.sh
sh user_create.sh root redhat
sh user_create.sh unix 123
id unix
su - unix #用密碼123成功登陸代表建立成功