圖片連接html
1.進入命令行,CLI(command line interface),也叫Linux控制檯
- 經過Linux控制檯終端訪問CLI
- Ctrl+Alt+F1~F7
注:tty:teletypewriter,指一臺用於發送消息的機器
控制檯的外觀設置命令:setterm2.經過圖形化的終端訪問CLI
1. bash手冊
1.1 熟悉DESCRIPTION部分的前兩段能夠學到不少技術行話
1.2 空格鍵:翻頁
1.3 回車鍵:逐行查看node2. Linux手冊頁的內容區域
- 1.可執行文件或shell命令
- 2.系統調用
- 3.庫調用
- 4.特殊文件
- 5.文格式約定
- 6.遊戲
- 7.概覽、約定及雜項
- 8.超級用戶和系統管理員命令
- 9.內核例程
- 查看所需的頁面:man section# topic
- 查看內容簡介:man 1 intro
- 另外一個參考信息:info info
3.Linux文件系統
3.1 常見的目錄名稱
- / :虛擬目錄的根目錄
- /bin :二進制目錄,存放許多用戶級的GNU工具
- /boot:啓動目錄,存放啓動文件
- /dev :設備目錄,Linux在這裏建立設備節點
- /etc :系統配置文件目錄
- /home:主目錄,Linux在這裏建立用戶目錄
- /lib :庫目錄,存放系統和應用程序的庫文件
- /media:媒體目錄,可移動媒體設備的經常使用掛載點
- /mnt :掛載目錄,另外一個可移動媒體設備的經常使用掛載點
- /opt :可選目錄,經常使用於存放第三方軟件包和數據文件
- /proc:進程目錄,存放現有硬件及當前進程的相關信息
- /root:root用戶的主目錄
- /sbin:系統二進制目錄,存放許多GNU管理員級工具
- /run :運行目錄,存放系統運做時的運行時數據
- /srv :服務目錄,存放本地服務的相關文件
- /sys :系統目錄,存放系統硬件信息的相關文件
- /tmp :臨時目錄,能夠在該目錄中建立和刪除臨時工做文件
- /usr :用戶二進制目錄,大量用戶級的GNU工具和數據文件都存儲在這裏
- /var :可變目錄,用以存放常常變化的文件,好比日誌文件
3.2 文件和目錄列表
- ls -F :區分文件和目錄
- ls -a :顯示隱藏目錄
- ls -F -R :遞歸列出當前目錄下包含的子目錄中的文件
- ls -l :長列表格式輸出,每行都包含了下述信息
文件類型,好比目錄( d )、文件( - )、字符型文件( c )或塊設備( b );
文件的權限(參見第6章);
文件的硬連接總數;
文件屬主的用戶名;
文件屬組的組名;
文件的大小(以字節爲單位);
文件的上次修改時間;
文件名或目錄名;3.3 使用元字符通配符過濾文件
- ls -l scr[ai]pt :a或i
- ls -l f[a-i]ll :指定字符範圍
- ls -l f[!a]ll :除了a
3.4 建立文件
- touch test_one :建立一個空文件,若是已經存在,則修改文件的建立時間
- touch -a test_one :改變文件建立時間
- ls -l –time=atime test_one :加粗文件建立時間
3.5 連接文件:指向文件真實位置的佔位符
3.5.1 符號連接:指向虛擬結構目錄中某個地方的另外一個文件,彼此內容不一樣
- ln -s data_file s1_data_file :給data_file建立一個符號連接
- ls -l *data_file :查看該連接文件,能夠看到大小不同
- ls -i *data_file :查看兩個文件的inode節點編號,能夠看到不同
3.5.2硬連接:會建立獨立的虛擬文件,包含原始文件的信息和位置,本質上是同一個文件(必須在同一個媒體)
- ln code_file h1_code_file :建立一個硬連接
- ls -li *code_file :查看兩個文件
3.6.刪除文件
- rm -i fall :帶提示的刪除
- rm -f fall :強制刪除
- rm -ri my_diir:刪除目錄中的文件,再刪除目錄自己
- rm -ri my_diir:遞歸刪除目錄中的文件,再刪除目錄自己
3.7 建立目錄
- mkdir -p New_dir/Sub_dir/under_ir :同時建立多個目錄及子目錄用 -p參數
- tree New_dir :以樹的形式查看目錄結構
3.8 查看文件內容
- file my_file :查看文件或者目錄類型
- cat -n test1 :顯示文本文件數據,並加上行號
- cat -b test1 :只給有文本的加上行號
- cat -T test1 :不讓製表符出現
- more test1 :顯示文件內容,不過會在每一頁後停下來
- less test1 :跟more差很少,可是更高級,支持方向鍵上下翻頁
- tail -n 2 test1 :只顯示最後兩行的內容
- head -n 2 test1 :顯示文件開頭兩行內容
1.監測程序
- ps :顯示運行在當前控制檯下的屬於當前用戶的進程
- ps -ef :顯示全部進程的完整信息
其餘參數- -A 顯示全部進程
- -N 顯示與指定參數不符的全部進程
- -a 顯示除控制進程(session leader ① )和無終端進程外的全部進程
- -d 顯示除控制進程外的全部進程
- -e 顯示全部進程
- -C cmdlist 顯示包含在 cmdlist 列表中的進程
- -G grplist 顯示組ID在 grplist 列表中的進程
- -U userlist 顯示屬主的用戶ID在 userlist 列表中的進程
- -g grplist 顯示會話或組ID在 grplist 列表中的進程 ②
- -p pidlist 顯示PID在 pidlist 列表中的進程
- -s sesslist 顯示會話ID在 sesslist 列表中的進程
- -t ttylist 顯示終端ID在 ttylist 列表中的進程
- -u userlist 顯示有效用戶ID在 userlist 列表中的進程
- -O format 顯示默認的輸出列以及 format 列表指定的特定列
- -o format 僅顯示由 format 指定的列
- -n namelist 定義了 WCHAN 列顯示的值
- -F 顯示更多額外輸出(相對 -f 參數而言)
- -M 顯示進程的安全信息
- -c 顯示進程的額外調度器信息
- -f 顯示完整格式的輸出
- -j 顯示任務信息
- -l 顯示長列表
F:內核分配給進程的系統標記
S:進程狀態(O表示正在運行,S表示正在休眠,R表示可運行,正在等待運行,Z表示殭屍進程)- -y 不要顯示進程標記(process flag,代表進程狀態的標記)
- -Z 顯示安全標籤(security context) ① 信息
- -H 用層級格式來顯示進程(樹狀,用來顯示父進程)
- -w 採用寬輸出模式,不限寬度顯示
- -L 顯示進程中的線程
- -V 顯示 ps 命令的版本號
top :跟ps類似,不過它顯示的是實時的
2.結束進程
- kill 3904 :給進程ID是3904的進程發送TERM(儘量終止)信號
- kill -s HUP 3940 :給進程ID是3904的進程發送HUP(掛起)信號
- killall http* :結束以http開頭的進程
3.檢測磁盤空間
- mount :列出當前系統上掛載的設備列表
- mount -t vfat /dev/sdb1 /media/disk :手動將U盤/dev/sdb1掛載到/media/disk目錄下
- umount /home/rich/mnt :卸載設備
- df -h :查看全部已掛載設備的的磁盤使用狀況,-h用易讀的方式顯示
- du /mnt/hgfs :查看特定目錄下的磁盤使用狀況,不加參數表示當前目錄
4.處理數據文件
- sort -n file :排序file文件,並把數字識別成數字
- sort -M file3 :按月份(3個字母)排序,經常使用於日誌文件
- sort -t ‘:’ -k 3 -n /etc/passwd :對密碼文件根據用戶ID排序,-t指定區分鍵位置字符,-k排序其實位置
- grep three file :在file中搜索three文本
- grep -v three filre :在file文件中反向搜索three文本,即不包含three的行
- grep -C three filre :在file文件中反向搜索three文本,只輸出有多少個行含有匹配模式
- grep -n three filre :在file文件中反向搜索three文本,僅輸出行號
- grep -e t -e f file :若是要指定多個模式,-e指定每一個模式
- grep [tf] file :使用正則表達式搜索包含字符t或者f的匹配
- gzip my* :經過通配符一次性批量壓縮文件
- gzcat myprog.c.gz :查看壓縮過的文本文件的內容
- gunzip myprog.c.gz :解壓文件
- tar -cvf test.tar test/ test2/ :歸檔文件
- tar -tf test.tar :列出test.tar的內容
- tar -zxvf file.tgz :解壓用gzip壓縮過的文件
shell不僅僅是一種CLI,它是一個時刻都在運行的交互式程序linux
/bin/sh:用於那些在系統啓動時使用的系統shell腳本
ps –forest:展現進程間的嵌套結構git5.1 可經過命令行參數修改shell的啓動方式
- -c string 從 string 中讀取命令並進行處理
- -i 啓動一個可以接收用戶輸入的交互shell
- -l 以登陸shell的形式啓動
- -r 啓動一個受限shell,用戶會被限制在默認目錄中
- -s 從標準輸入中讀取命令
5.2 經常使用命令
- echo $BASH_SUBSHELL :查看子shell的個數
- sleep 10 :會話暫停10秒鐘
- sleep 10& :sleep命令睡眠10秒鐘放到後臺運行
- jobs :顯示當前運行在後臺模式的全部用戶進程(做業)
- coproc sleep 10 :在後天生成一個子shell,並把命令放到後臺運行
- coproc My_job { sleep 10; } :給協程命名
5.3 理解shell的內建命令
5.3.1 外部命令:也叫文件系統命令,一般位於/bin、/usr/bin、/sbin或者/usr/sbin中
- which ps :用which命令找到外部ps命令
- type ps :跟上面同樣
5.3.2內部命令:不須要使用子進程來執行,做爲shell的組成部分存在
- type cd :查看cd是否是內部命令
- history :跟蹤使用過的命令,保存在隱藏文件.bash_history中,位於用戶主目錄
!! :喚回並重用歷史命令中最近的命令
history -a :強制將歷史記錄寫入.bash_history
!20 :喚回歷史命令中的第20條命令- alias :查看可用的別名
- alias ll=’ls -alF’ :設置別名,不過僅在被定義的shell中才有效
bash shell用一個叫作環境變量的(enviroment variable)的特性來存儲有關 shell會話 和 工做環境 的信息
6.1 全局/局部 環境變量
—-全局環境變量對於shell會話和全部生成的字shell都是可見的
—-局部變量則只對建立他們的shell可見
+ printenv :查看全部全局變量
+ printenv HOME :查看單個環境變量
+ env HOME :查看單個全局變量
+ echo
HOME :經過"$」引用HOME的值
+ set :顯示全部全局、局部和用戶自定義的環境變量github
6.2設置用戶定義變量
+ my_variable=hello :變量名、等號和值之間沒有空格,在子shell中不能用,退出shell後也會被清除
+ echo
PATH:. #修改環境變量,持續到退出或重啓系統正則表達式
6.3 定位系統環境變量
當登入Linux系統啓動一個bash shell時,默認狀況下bash會在幾個文件中查找命令,這些文件叫 啓動文件 或 環境文件shell
- 查看、/etc目錄下通用的bashrc文件
- 爲用戶提供一個定製本身的命令別名和私有腳本函數的地方
7.3 理解文件權限express
- 表明文件
d 表明目錄
l 表明連接
c 表明字符型設備
b 表明塊設備
n 表明網絡設備編程
r 表明對象是可讀的
w 表明對象是可寫的
x 表明對象是可執行的vim
對象的屬主
對象的屬組
系統其餘用戶
+ umask 026 :用 umask 命令爲默認 umask 設置指定一個新值,一樣會做用在建立目錄上,見/etc/login.defs或/etc/profile
7.4 改變安全性設置
+ chmod 760 newfile :八進制模式設置
+ chmod o+r newfile :符號模式,[ugoa…][[+-=][rwxXstugo…]
u 表明用戶
g 表明組
o 表明其餘
a 表明上述全部
X :若是對象是目錄或者它已有執行權限,賦予執行權限。
s :運行時從新設置UID或GID。
t :保留文件或目錄。
u :將權限設置爲跟屬主同樣。
g :將權限設置爲跟屬組同樣。
o :將權限設置爲跟其餘用戶同樣。
+ chown hzq.shared newdir -R:可用登陸名或UID來指定文件的新屬主.屬組,遞歸地改變子目錄和文件的所
屬關係
+ chown hzq. newfile :若是你的Linux系統採用和用戶登陸名匹配的組名,能夠只用一個條目就改變兩者。
+ chgrp shared newfile :更改文件或目錄的默認屬組
7.5 共享文件
+ chmod g+s testdir :使目錄裏的新文件都能沿用目錄的屬組,只需將該目錄的SGID位置位,等效於:chmod 2776 testdir
+ Linux還爲每一個文件和目錄存儲了3個額外的信息位。
粘着位:進程結束後文件還駐留(粘着)在內存中。
設置組ID(SGID):對文件來講,程序會以文件屬組的權限運行;對目錄來講,目錄中建立的新文件會以目錄的默認屬組做爲默認屬組。
設置用戶ID(SUID):當文件被用戶使用時,程序會以文件屬主的權限運行。
h :左移一個字符。
j :下移一行(文本中的下一行)。
k :上移一行(文本中的上一行)。
l :右移一個字符。
PageDown (或Ctrl+F):下翻一屏。
PageUp (或Ctrl+B):上翻一屏。
G :移到緩衝區的最後一行。
num G :移動到緩衝區中的第 num 行。
gg :移到緩衝區的第一行。
w filename :將文件保存到另外一個文件中
刪除:x(取叉、錯的意思):刪除當前光標所在位置的字符
刪除:dd(delete ):刪除當前光標所在行,至關於剪切
刪除:dw(delete word):刪除當前光標所在位置的單詞
刪除:d ) 刪除當前光標所在位置至行尾的內容
拼接行:J(join ),刪除當前光標所在行行尾的換行符
撤銷:u(unsure)
追加數據 :a(add),相似於 「i」
行尾追加 : A(Add)
insert:r char(char表示一個字符):用 char 替換當前光標所在位置的單個字符
insert:R text(至關於insert)直到按下ESC鍵
複製:v—->移動光標—->y—->p
查找:/+string—–>n(next)
替換:s/old/new/
:s/old/new/g :一行命令替換全部 old 。
:n,ms/old/new/g :替換行號 n 和 m 之間全部 old 。
:%s/old/new/g :替換整個文件中的全部 old 。
:%s/old/new/gc :替換整個文件中的全部 old ,但在每次出現時提示。
#!/bin/bash # This script displays the date and who's logged on echo -n The time and date are: #注意-n選項不換行 date echo "Let's see who's logged into the system:" #全部的引號均可以正常輸出了 who #能夠將 echo 語句添加到shell腳本中任何須要顯示額外信息的地方
#!/bin/bash # display user information from the system. echo "User info for userid: $USER" echo UID: $UID #1.環境變量名稱以前加上美圓符"$"來使用這些環境變量 echo HOME: "$HOME" #2.加上雙引號也沒有問題 echo "The cost of the item is \$15" #3.想顯示"$"符號須要在前面加上反斜槓 # testing variables days=10 #4.shell腳本會自動決定變量值的數據類型 guest="Katie" #5.變量名區分大小寫 echo "$guest checked in $days days ago" days=5 #6.賦值時不用$,可是引用必須用$符號 guest="Jessica" echo "$guest checked in $days days ago" #7.在shell腳本結束時變量會被刪除掉 #有兩種方法能夠將命令輸出賦給變量: #1. 反引號字符( ` ) :注意不是單引號(') #2. $() 格式 one=`date` #8.shell命令的輸出賦給變量方法1 two=$(date) #9.賦值等號和命令替換字符之間沒有空格 echo "The date and time are: " $one # #下面這個例子很常見,它在腳本中經過命令替換得到當前日期並用它來生成惟一文件名。 # copy the /usr/bin directory listing to a log file today=$(date +%y%m%d) #today存儲日期 ls /usr/bin -al > log.$today #ls的輸出重定向到log.180515文件中,若是輸出文件已經存在了,重定向操做符會用新的文件數據覆蓋已有文件(默認的 umask 設置)
在shell腳本中有兩種途徑來進行數學運算
+ expr 1 + 5 :計算加法表達式
+ expr 5 * 2 :計算乘法表達式
ARG1 | ARG2
若是 ARG1 既不是null也不是零值,返回 ARG1 ;不然返回 ARG2
ARG1 & ARG2
若是沒有參數是null或零值,返回 ARG1 ;不然返回 0
ARG1 < ARG2
若是 ARG1 小於 ARG2 ,返回 1 ;不然返回 0
ARG1 <= ARG2
若是 ARG1 小於或等於 ARG2 ,返回 1 ;不然返回 0
ARG1 = ARG2
若是 ARG1 等於 ARG2 ,返回 1 ;不然返回 0
ARG1 != ARG2
若是 ARG1 不等於 ARG2 ,返回 1 ;不然返回 0
ARG1 >= ARG2
若是 ARG1 大於或等於 ARG2 ,返回 1 ;不然返回 0
ARG1 > ARG2
若是 ARG1 大於 ARG2 ,返回 1 ;不然返回 0
ARG1 + ARG2
返回 ARG1 和 ARG2 的算術運算和
ARG1 - ARG2
返回 ARG1 和 ARG2 的算術運算差
ARG1 * ARG2
返回 ARG1 和 ARG2 的算術乘積
ARG1 / ARG2
返回 ARG1 被 ARG2 除的算術商
ARG1 % ARG2
返回 ARG1 被 ARG2 除的算術餘數
STRING : REGEXP
若是 REGEXP 匹配到了 STRING 中的某個模式,返回該模式匹配
match STRING REGEXP
若是 REGEXP 匹配到了 STRING 中的某個模式,返回該模式匹配
substr STRING POS LENGTH
返回起始位置爲 POS (從 1 開始計數)、長度爲 LENGTH 個字符的子字符串
index STRING CHARS
返回在 STRING 中找到 CHARS 字符串的位置;不然,返回 0
length STRING
返回字符串 STRING 的數值長度
_ + TOKEN :將 TOKEN 解釋成字符串,即便是個關鍵字
(EXPRESSION) : 返回 EXPRESSION 的值
#!/bin/bash
var1=100
var2=45
var3=$(echo "scale=4; $var1 / $var2" | bc)#將 scale 變量設置成了四位小數,並在 expression 部分指定了特定的運算
echo The answer for this is $var3
注意下面的註釋:不能加Tab
#!/bin/bash
var1=10.23
var2=43.12
var3=33.2
var4=31
var5=$(bc<<EOF
scale = 4 #注意不能加tab鍵
a1 = ($var1 * $var2)
b1 = ($var3 * $var4)
a1 + b1
EOF
)
echo The final answer for this mess is $var5
Linux退出狀態碼
0命令成功結束
1 通常性未知錯誤
2 不適合的shell命令
126 命令不可執行
127 沒找到命令
128 無效的退出參數
128+x 與Linux信號x相關的嚴重錯誤
130 經過Ctrl+C終止的命令
255 正常範圍以外的退出狀態碼
exit 命令:容許你在腳本結束時指定一個退出狀態碼
如:exit 5
#!/bin/bash
#shell中運行的每一個命令都使用退出狀態碼(exit status)告訴shell它已經運行完畢
var1=10
var2=30
var3=$[$var1 + $var2]
exit $var3 #exit 命令的參數中使用變量
#若是值大於255,返回模256後獲得的餘數
纔會
被執行#!/bin/bash
# 這個腳本在 if 行採用了 pwd 命令。若是命令成功結束, echo 語句就會顯示該文本字符串
if pwd
then
echo "It worked"
fi
if IamNotaCommand #因爲這是個錯誤的命令,因此它會產生一個非零的退出狀態碼
then
echo "It "
echo "worked" #這裏能夠放多條明令
else
echo "It not worked!"
fi
#!/bin/bash
# 甚至能夠更進一步,讓腳本檢查擁有目錄的不存在用戶以及沒有擁有目錄的不存在用戶。這
# 能夠經過在嵌套 elif 中加入一個 else 語句來實現。
testuser=NoSuchUser
#
if grep $testuser /etc/passwd
then
echo "The user $testuser exists on this system."
#
elif ls -d /home/$testuser #每塊命令都會根據命令是否會返回退出狀態碼 0 來執行。記住,bash shell會依次執行 if 語句,
#只有第一個返回退出狀態碼 0 的語句中的 then 部分會被執行
then
echo "The user $testuser does not exist on this system."
echo "However, $testuser has a directory."
#
else
echo "The user $testuser does not exist on this system."
echo "And, $testuser does not have a directory."
fi
n1 -eq n2
檢查 n1 是否與 n2 相等
n1 -ge n2
檢查 n1 是否大於或等於 n2
n1 -gt n2
檢查 n1 是否大於 n2
n1 -le n2
檢查 n1 是否小於或等於 n2
n1 -lt n2
檢查 n1 是否小於 n2
n1 -ne n2
檢查 n1 是否不等於 n2
#!/bin/bash
# Using numeric test evaluations
#使用中括號進行數值測試
value1=10
value2=11
#
if [ $value1 -gt 5 ] #可是隻能測試整數
then
echo "The test value $value1 is greater than 5"
fi
#
if [ $value1 -eq $value2 ]
then
echo "The values are equal"
else
echo "The values are different"
fi
12.3.2 字符串比較
str1 = str2
檢查 str1 是否和 str2 相同
str1 != str2
檢查 str1 是否和 str2 不一樣
str1 < str2
檢查 str1 是否比 str2 小
str1 > str2
檢查 str1 是否比 str2 大
-n str1
檢查 str1 的長度是否非0
-z str1
檢查 str1 的長度是否爲0
在比較測試中,大寫字母被認爲是小於小寫字母的。但 sort 命令剛好相反,由於sort使用的是系統的本地化語言設置中定義的排序順序,而比較測試中使用的是標準的ASCII順序
#!/bin/bash
# mis-using string comparisons
#
val1=baseball
val2=hockey
#
if [ $val1 \> $val2 ] #注意,必須加斜槓,不然會被當成重定向符
then
echo "$val1 is greater than $val2"
else
echo "$val1 is less than $val2"
fi
# testing string length
val1=testing
val2=''
#
if [ -n $val1 ]
then
echo "The string '$val1' is not empty"
else
echo "The string '$val1' is empty"
fi
#
if [ -z $val2 ]
then
echo "The string '$val2' is empty"
else
echo "The string '$val2' is not empty"
fi
#
if [ -z $val3 ]
then
echo "The string '$val3' is empty"
else
echo "The string '$val3' is not empty"
fi
檢查 file 是否存在並是一個目錄 | -d file |
---|---|
檢查 file 是否存在 | -e file |
檢查 file 是否存在並是一個文件 | -f file |
檢查 file 是否存在並可讀 | -r file |
檢查 file 是否存在並不是空 | -s file |
檢查 file 是否存在並可寫 | -w file |
檢查 file 是否存在並可執行 | -x file |
檢查 file 是否存在並屬當前用戶全部 | -O file |
檢查 file 是否存在而且默認組與當前用戶相同 | -G file |
檢查 file1 是否比 file2 新 ,必須先確認文件是存在的 | file1 -nt file2 |
檢查 file1 是否比 file2 舊 | file1 -ot file2 |
#!/bin/bash
# Look before you leap
# 文件測試
jump_directory=/home/hzq
#
if [ -d $jump_directory ]
then
echo "The $jump_directory directory exists"
cd $jump_directory
ls
else
echo "The $jump_directory directory does not exist"
fi
if-then 語句容許你使用布爾邏輯來組合測試。有兩種布爾運算符可用:
+ [ condition1 ] && [ condition2 ]
+ [ condition1 ] || [ condition2 ]
#!/bin/bash
# using double parenthesis
#
val1=10
#
if (( $val1 ** 2 > 90 ))
then
(( val2 = $val1 ** 2 ))
echo "The square of $val1 is $val2"
fi
# val++ 後增
# val-- 後減
# ++val 先增
# --val 先減
# ! 邏輯求反
# ~ 位求反
# ** 冪運算
# << 左位移
# >> 右位移
# & 位布爾和
# | 位布爾或
# && 邏輯和
# || 邏輯或
#!/bin/bash
# using pattern matching
# 使用模式匹配
if [[ $USER == r* ]]
then
echo "Hello $USER"
else
echo "Sorry, I do not know you"
fi
#!/bin/bash
# using the case command
# 使用case命令
case $USER in
rich | barbara)
echo "Welcome, $USER"
echo "Please enjoy your visit";;
testing)
echo "Special testing account";;
jessica) #")"至關於C語言中的":"
echo "Do not forget to log off when you're done";;
*) #*通配符即匹配全部狀況
echo "Sorry, you are not allowed here";;
esac #case語句結束
#!/bin/bash
# another example of how not to use the for command
for test in I don\'t know if "this'll" work #不添加反斜槓會被視做一個字符串 do #若是一個詞語中有空格,須要用雙引號圈起來 echo "word:$test" done
#!/bin/bash
# reading values from a file
file="states"
for state in $(cat $file)
do
echo "Visit beautiful $state"
done
for語句中的list中,環境變量 IFS(內部字段分隔符)默認會用空格、製表符、換行符做爲分隔符
+ IFS.OLD=
’\n’:;」 :使用換行、冒號、分號做爲分隔符
<在代碼中使用新的IFS值>
IFS=$IFS.OLD :修改使只識別換行符
#!/bin/bash
# testing the C-style for loop
for (( i=1; i <= 10; i++ )) #1.變量賦值能夠有空格
do #2.條件中的變量不以美圓符開頭
echo "The next number is $i" #3.迭代過程的算式未用 expr 命令格式
done
##############################
# multiple variables
for (( a=1, b=10; a <= 10; a++, b-- ))
do
echo "$a - $b"
done
##############################
#!/bin/bash
# testing a multicommand while loop
var1=10
while echo $var1 #檢查 var1 是否大於等於 0
[ $var1 -ge 0 ] #只有最後一個測試命令的退出狀態碼會被用來決定何時結束循環
do #每次迭代中全部的測試命令都會被執行,區別於C語言的 ||
echo "This is inside the loop"
var1=$[ $var1 - 1 ]
done
#!/bin/bash
# using the until command
var1=100
until echo $var1 #shell會執行指定的多個測試命令,只有在最後一個命令成立時中止
[ $var1 -eq 0 ] #退出狀態碼不爲0,才執行循環中列出的命令
do # -eq :檢查是否相等
echo Inside the loop: $var1
var1=$[ $var1 - 25 ]
done
$ cat test14
#!/bin/bash
# nesting for loops
for (( a = 1; a <= 3; a++ ))
do
echo "Starting loop $a:"
for (( b = 1; b <= 3; b++ ))
do
echo " Inside loop: $b"
done
done
#!/bin/bash
# changing the IFS value
# 經過改變IFS的值處理 /etc/passwd文件
IFS.OLD=$IFS
IFS=$'\n' #先按行處理文件數據
for entry in $(cat /etc/passwd)
do
echo "Values in $entry –"
IFS=: #再把每一行用空格分開
for value in $entry
do
echo " $value"
done
done
#!/bin/bash
# breaking out of an outer loop
for (( a = 1; a < 4; a++ ))
do
echo "Outer loop: $a"
for (( b = 1; b < 100; b++ ))
do
if [ $b -gt 4 ]
then
break 2 #1.注意,加上參數這裏能夠跳出兩層循環
fi
echo " Inner loop: $b"
done
done
#!/bin/bash
# continuing an outer loop
for (( a = 1; a <= 5; a++ ))
do
echo "Iteration $a:"
for (( b = 1; b < 3; b++ ))
do
if [ $a -gt 2 ] && [ $a -lt 4 ]
then
continue 2 #1.加上參數指定要繼續執行哪一級循環
fi
var3=$[ $a * $b ]
echo " The result of $a * $b is $var3"
done
done
#!/bin/bash
for file in /home/hzq/*
do
if [ -d "$file" ]
then
echo "$file is a directory"
elif [ -f "$file" ]
then
echo "$file is a file"
fi
done
#!/bin/bash
# finding files in the PATH
IFS=:
for folder in $PATH #1.遍歷每個PATH目錄中的路徑
do
echo "$folder:" #2. 打印這些路徑
echo "$IFS"
for file in $folder/* #爲何IFS是":",可是這裏仍是能分開
do
echo "$IFS"
if [ -x $file ]
then
echo " $file"
fi
done
done
#!/bin/bash
# using one command line parameter
#
factorial=1
for (( number = 1; number <= $1 ; number++ ))
do
factorial=$[ $factorial * $number ]
done
echo The factorial of $1 is $factorial
if [ -n "$1" ]&&[ -n "$2" ] #0.注意:這裏必須加引號
then
total=$[ $1 * $2 ] #1.一個參數乘以第二個參數
echo The first parameter is $1. #2.參數也能夠是字符串,以空格分隔
echo The second parameter is $2. #3.若是參數不止9個,能夠用花括號:${10}
echo The total value is $total.
else
echo "please input two number"
fi
echo "$0 is run in the end" #4.$0保存的是腳本的名字
#潛在問題:若是使用另外一個命令來運行shell腳本,命令會和腳本名混在一塊兒,出如今 $0 參數中。
echo "$(basename $0)is run in the end " #不過能夠這樣解決
#!/bin/bash
# testing $* and $@
#
echo
count=1
#
for param in "$*" #$* :全部的參數
do
echo "\$* Parameter #$count = $param"
count=$[ $count + 1 ]
done
#
echo
count=1
#
for param in "$@"
do #$@ :將參數視做單獨的單詞
echo "\$@ Parameter #$count = $param"
count=$[ $count + 1 ]
done
#!/bin/bash
# demonstrating the shift command
echo
count=1
while [ -n "$1" ]
do
echo "Parameter #$count = $1"
count=$[ $count + 1 ]
shift 2 #向左移動參數,可是$0不變,加上參數表示一次移動兩個
done
set -- $(getopt -q ab:cd "$@")
#!/bin/bash
# Extract command line options & values with getopt
#
set -- $(getopt -q ab:cd "$@")
#
echo
while [ -n "$1" ]
do
case "$1" in
-a) echo "Found the -a option" ;;
-b) param="$2"
echo "Found the -b option, with parameter value $param"
shift ;;
-c) echo "Found the -c option" ;;
--) shift
break ;;
*) echo "$1 is not an option";;
esac
shift
done
#
count=1
for param in "$@"
do
echo "Parameter #$count: $param"
count=$[ $count + 1 ]
done
#須要注意的是:getopt 命令並不擅長處理帶空格和引號的參數值,以下面這種狀況
#$ ./32_getopt.sh -a -b test1 -cd "test2 test3" test4
#!/bin/bash
# Processing options & parameters with getopts
#
echo
while getopts :ab:cd opt #指明要查找哪些命令行選項,以及每次迭代中存儲它們的變量名(opt)
do
case "$opt" in
a) echo "Found the -a option" ;; #注意這裏沒有單破折號,已經移除了
b) echo "Found the -b option, with value $OPTARG" ;;
c) echo "Found the -c option" ;;
d) echo "Found the -d option" ;;
*) echo "Unknown option: $opt" ;;
esac
done
#
shift $[ $OPTIND - 1 ]
#
echo
count=1
for param in "$@"
do
echo "Parameter $count: $param"
count=$[ $count + 1 ]
done
#./32_getopt.sh -b "test1 test2" -a :如今能夠正常解析空格了
#./32_getopt.sh -abtest1 :將選項字母和參數值放在一塊兒使用,而不用加空格
#./32_getopt.sh -acde :將命令行上找到的全部未定義的選項統一輸出成問號
#!/bin/bash
# testing the read -p option
#
#
echo -n "Enter your name: " # -n 參數使不換行
read name
echo "Hello $name, welcome to my program. "
# -t 指定等待的秒數
read -t 5 -p "Enter your name: " # 不指定變量,數據會放入特殊環境變量REPLY中
echo Hello $REPLY, welcome to my program.
read -p "Please enter your age: " age # -p 命令直接指定提示字符串
days=$[ $age * 365 ]
echo "That makes you over $days days old! "
read -n1 -p "Do you want to continue [Y/N]? " answer
case $answer in # -n 參數指定接收的輸入個數
Y | y) echo
echo "fine, continue on…";;
N | n) echo
echo OK, goodbye
exit;;
esac
# -s 參數避免在命令中輸入的數據出如今顯示器上
read -s -p "Enter your password: " pass #事實是會顯示,只是跟背景色同樣
echo "Is your password really $pass? "
#!/bin/bash
# reading data from a file
count=1
test="34_read_input.sh"
cat $test | while read line #1.每次讀取一行
do #2.
echo "Line $count: $line"
count=$[ $count + 1]
done
echo "Finished processing the file"
shell自動賦予了錯誤消息更高的優先級
echo "This is an error" >&2
:有意生成一條錯誤信息exec 1>testout
:用 exec 命令告訴shell在腳本執行期間重定向某個特定文件描述符exec 0< testfile
: exec 命令容許你將 STDIN 重定向到Linux系統上的文件中#!/bin/bash
# using an alternative file descriptor
exec 3>test13out #能夠用 exec 命令來給輸出分配文件描述符
#exec 3>>test13out #也可使用 exec 命令來將輸出追加到現有文件中
echo "This should display on the monitor"
echo "and this should be stored in the file" >&3
echo "Then this should be back on the monitor"
#!/bin/bash
# storing STDOUT, then coming back to it
exec 3>&1 #1.文件描述符3重定向到標準輸出
exec 1>test14out #2.標準輸出重定向到文件
echo "This should store in the output file"
echo "along with this line."
exec 1>&3 #3.利用該文件描述符3重定向回 STDOUT
echo "Now things should be back to normal" #+.這句輸出到屏幕
#!/bin/bash
# redirecting input file descriptors
exec 6<&0 #1.先用文件描述符 6 用來保存 STDIN 的位置
exec 0< testfile #2.將 STDIN 重定向到一個文件
count=1
while read line #3.read命令的全部輸入都來自重定向後的 STDIN
do
echo "Line #$count: $line"
count=$[ $count + 1 ]
done
exec 0<&6 #4.將 STDIN 恢復到原先的位置
read -p "Are you done now? " answer
case $answer in
Y|y) echo "Goodbye";;
N|n) echo "Sorry, this is the end.";;
esac
#!/bin/bash
# testing input/output file descriptor
exec 3<> testfile #1.用exec命令將文件描述符 3 分配給文件 testfile 以進行文件讀寫
read line <&3 #2.用 read 命令讀取文件中的第一行
echo "Read: $line" #3.須要注意:寫入文件中的數據會覆蓋已有的數據
echo "This is a test line" >&3
#!/bin/bash
# testing closing file descriptors
exec 3> test17file
echo "This is a test line of data" >&3
exec 3>&- #1.要關閉文件描述符,將它重定向到特殊符號 &-
echo "This won't work" >&3 #2.這裏shell會生成錯誤消息
cat test17file #3.打開了同一個輸出文件,shell會用一個新文件來替換已有文件
exec 3> test17file
echo "This'll be bad" >&3 #4.因此意味着這幾句話會覆蓋已有文件
/usr/sbin/lsof -a -p $$ -d 0,1,2
#!/bin/bash
#creating and using a temp file
tempfile=$(mktemp test19.XXXXXX) #生產一個臨時文件
exec 3>$tempfile #輸出重定向到該文件
echo "This script writes to temp file $tempfile"
echo "This is the first line" >&3
echo "This is the second line." >&3
echo "This is the last line." >&3
exec 3>&- #關閉文件描述符
echo "Done creating temp file. The contents are:"
cat $tempfile
rm -i $tempfile 2> /dev/null #刪除文件,並把刪除的提示信息輸出到/dev/null,即不顯示
#!/bin/bash
# using a temporary directory
tempdir=$(mktemp -d dir.XXXXXX) #建立臨時文件夾
cd $tempdir
tempfile1=$(mktemp temp.XXXXXX)
tempfile2=$(mktemp temp.XXXXXX)
exec 7> $tempfile1 #重定向文件描述符到文件
exec 8> $tempfile2
echo "Sending data to directory $tempdir"
echo "This is a test line of data for $tempfile1" >&7
echo "This is a test line of data for $tempfile2" >&8
#!/bin/bash
# Modifying a set trap
#
trap "echo ' Sorry... Ctrl-C is trapped.'" SIGINT
#捕獲"終止進程"信號
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
#
trap "echo ' I modified the trap!'" SIGINT
#到這裏處理信號的方式已經變了
count=1
while [ $count -le 5 ]
do
echo "Second Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
trap -- SIGINT #刪除設置好的捕獲,單破折號也能起做用
echo "Ctrl-C can use le"
count=1
while [ $count -le 5 ]
echo "Second Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
./test4.sh &
:只須要像這樣,在命令後面加一個&,可是這樣仍是會有輸出,不要奇怪nohup ./test1.sh &
:能夠用nohup命令,阻斷全部發送給該進程的SIGHUP信號,輸出會被保存到nohup.out文件中jobs -l
bg
:之後臺模式重啓一個做業,若是有多個就得加做業號fg 2
:之前臺模式重啓做業,可用帶有做業號的 fg 命令從-20(最高優先級)到+19(最低優先級),默認以0優先級啓動,能夠記作」好人難作」
+ nice -n 10 ./test4.sh > test4.out &
:nice命令指定運行的優先級
+ ps -p 4973 -o pid,ppid,ni,cmd,能夠用這個命令驗證
+ -n 選線不是必須的,只須要指定優先級就好了
+ 可是像下降優先級必須得有root權限
+ renice -n 10 -p 5055
+ renice命令容許改變已經運行進程的優先級
+ 只能對屬於你的進程執行 renice
+ 只能經過 renice 下降進程的優先級
+ root用戶能夠經過 renice 來任意調整進程的優先級
at [-f filename] time
:指定Linux系統什麼時候運行腳本 atq
:查看系統中有哪些做業在等待atrm 18
:根據做業號刪除指定做業date +%d -d tomorrow
= 01 ] ; then ; command :每月的最後一天執行的命令period delay identifier command
function divem { echo $[ $1 / $2 ]; }
:採用單行方式定義函數 function doubleit { read -p "Enter value: " value; echo $[$value * 2 ]; }
:須要注意的是得加分號,這樣才知道起止位置 [ 2 ]
}
- 也能夠像這樣採用多行定義的方式
. /home/rich/libraries/myfuncs
:能夠在bashrc文件末尾加上你本身的函數庫
sed options script file
echo "This is a test" | sed 's/test/big test/'
sed 's/dog/cat/' data1.txt
:不過不會修改文本文件的數據,只是顯示到STDOUTsed -e 's/brown/green/; s/dog/cat/' data1.txt
:使用多個命令須要用-e參數sed -e '
:而後把命令一條一條輸進去sed -f script1.sed data1.txt
:也能夠把上述三條命令放進一個文件,經過-f參數指定這個文件,去處理data1.txtgawk options program file
gawk '{print "Hello World!"}'
:對每行文本執行腳本gawk '{print $1}' data2.txt
:打印date2.txt文件中每行的第一個單詞,默認是空白字符或者製表符做爲分隔符gawk -F: '{print $1}' /etc/passwd
:-F指定字段分隔符echo "My name is Rich" | gawk '{$4="Christine"; print $0}'
:要執行多個命令,只須要用」;」分隔gawk '{
:也能夠用此提示符一行一行的輸入gawk -F: -f script2.gawk /etc/passwd
:能夠把命令放到script.gawk文件中,經過-f參數運行sed '2,$s/test/trial/' data4.txt 3gpw data4s.txt
:轉義字符前加」\」 sed '/Samantha/s/bash/csh/' /etc/passwd
:Samantha這裏能夠替換成正則表達式,因此整句只查找正則表達式匹配到的行sed '3d' data6.txt
:刪除第三行sed '2,3d' data6.txt
:刪除2~3行sed '3,$d' data6.txt
:刪除第三行開始之後的全部行sed '/number 1/d' data6.txt
:刪除出現number 1的行sed '/1/,/3/d' data6.txt
:第一個模式打開刪除功能,第二個模式關閉刪除功能,sed編輯器會刪除兩個指定行之間的全部內容,若是後面又匹配到1,又會打開刪除模式echo "Test Line 2" | sed 'i\Test Line 1'
:-i參數在指定行前面插入一行echo "Test Line 2" | sed 'a\Test Line 1'
:-a參數在指定行後面添加一行sed '3i\> This is an inserted line.' data6.txt
:這是一個將新行插入到第三行前面的例子sed '$a\> This is a new line of text.' data6.txt
附加到末尾sed '3c\ This is a changed line of text.' data6.txt
:-c參數指定修改模式,這裏修改第三行sed '/number 3/c\ This is a changed line of text.' data6.txt
:也能夠經過模式匹配的方式修改sed '2,3c\ This is a new line of text.' data6.txt
:也可使用區間地址,可是這一行會覆蓋二、3兩行sed 'y/123/789/' data8.txt
:1替換成9,2替換成8,3替換成9,直到替換完全部的字符sed -n '/number 3/p' data6.txt
:-p參數表打印模式,-n參數用來禁止輸出其餘行sed '=' data1.txt
:」=」打印的會輸出行號sed -n 'l' data9.txt
:打印數據流中的文本和不可打印的ASCII字符sed '1,2w test.txt' data6.txt
:將數據流中的前兩行打印到文件中sed '3r data12.txt' data6.txt
:將data12.txt中的數據插入到data6.txt的第三行後面sed '/number 2/r data12.txt' data6.txt
:將data12中的數據插入到匹配行的後面sed '$r data12.txt' data6.txt
:插入到末尾echo "This is a test 1" | sed -n '/test 1/p'
:p命令輸出匹配到的行,注意空格和其餘字符並無什麼區別echo "This is a test" | gawk '/tes/{print $0}'
:print命令輸出匹配到的行,注意兩種寫法都區分大小寫,不用寫出完整單詞.*[]^${}\+?|()
sed -n '/\$/p' data2
:使用特殊字符必須轉義echo "3 / 2" | sed -n '/\//p'
:注意,使用正斜線也必須轉義echo "Books are great" | sed -n '/^ Book/p'
:Book必須出如今行首才能匹配到echo "This ^ is a test" | sed -n '/s ^ /p'
:脫字符放在其餘地方就變成普通字符了echo "This is a good book" | sed -n '/book$/p'
:字符」$」指明數據行必須以該文本結尾sed -n '/^ this is a test$/p' data4
:會忽略那些不僅僅只包含這些文本的行sed '/^ $/d' data5
:刪除文本中的空白行sed -n '/.at/p' data6
:」.」匹配任意一個字符,若是沒有(如行首)則匹配失敗sed -n '/[ch]at/p' data6
:[ch]字符組取代」.」使通配符精確一點,不過必須有一個字符組中的字符被匹配到sed -n ' /^ [0123456789][0123456789]$/p ' data8
:匹配只出現兩個數字的一行sed -n '/[^ ch]at/p' data6
:在字符組的開頭加上脫字符,就成了了排除型字符組sed -n '/^[0-9][c-h][a-ch-m]$/p' data8
:單破折號表示linux字符集中得字符,即這樣能夠表示區間,最後一個區間表示a~c,h~m特殊字符
echo "ieeeek" | sed -n '/ie*k/p'
:字符後面放*,表示該字符要出現一次或屢次
echo "this is a regular pattern expression" | sed -n '/regular.*expression/p'
:.*
的組合表示若干字符echo "bt" | gawk '/b[ae]?t/{print $0}'
:?表示字符組出現了一次或零次,另外,注意sed不支持擴展的正則表達式echo "beeet" | gawk '/be+t/{print $0}'
:加號表示+前面的字符至少出現一次echo "bet" | gawk --re-interval '/be{1}t/{print $0}'
:{}中的1表示e恰好出現了一次echo "bt" | gawk --re-interval '/be{1,2}t/{print $0}'
:{}中的1,2表示至少出現一次,最多出現兩次echo "The cat is asleep" | gawk '/cat|dog/{print $0}'
:管道容許匹配兩個模式中的任何一個echo "Saturday" | gawk '/Sat(urday)?/{print $0}'
:()能對字符進行分組,即表示urday是一個總體