您好,登錄后才能下訂單哦!
概述:
歷史命令(history)、調用上一個命令最后一個參數(esc+.或!$)、命令展開機制(~,{,})、回顯命令狀態(echo $?)、引用命令執行結果($(command)或'command')、bash引用(強引用(“ ”)、弱引用(' ')。)、bash快捷鍵(ctrl+ a\e\u\k\l)、文件名通配(*\?\[ ]\[^ ])、輸入輸出錯誤重定向(>\>>\<\<<\2>\2>>\&>\&>>)、tr命令(替換字符)、tee(輸出一份到屏幕,同時保留一份到文件)、hash(緩存或顯示此前的命令)、shell變量、多命令執行(command1;comamnd2)
1、history:命令歷史(設置、調用、控制)
a)、命令用法(shell進程會在會話中保存此前用戶提交執行過的命令)
#history //包括正常關機以前的命令,
[root@localhost ~]# type history //history是個內嵌命令
history 是 shell 內嵌
#echo $HISTSIZE //顯示命令歷史條數
HISTSIZE:他是一個環境變量,
HISTFILE: 每個用戶下都有一個自己的保存歷史命令的文件,且是隱藏的如:(.bash_history)。
#cat .bash_history //不會保存用戶剛剛用過的命令,只有用戶退出當前shell時才保存。
#echo $HISTFILESIZE //顯示命令歷史文件的大小。
[root@localhost ~]# echo $HISTSIZE
1000
[root@localhost ~]# echo $HISTFILESIZE
1000
history命令用法:
[root@localhost ~]# help history
history: history [-c] [-d 偏移量] [n] 或 history -anrw [文件名] 或 history -ps 參數 [參數...]
顯示或操縱歷史列表。
-c:清空命令歷史
-d # :刪除指定位置的歷史命令
-d # n:刪除從#位置開始的n個歷史命令
-r: 從文件中讀取歷史命令
-w:將命令歷史寫入歷史文件中。
-n: 顯示最近的n條命令
b)、命令歷史調用
b1)、通過上下鍵來選擇
b2)、通過!(感嘆號)來實現:
#!n: 再一次執行歷史命令列表中的第#條命令。
#!!:再一次執行上一條命令
#!STRING:在一次執行命令歷史列表中最近一個以STRING開頭的命令。
C)、調用上一條命令的最后一個參數:
c1)、按下ESC鍵松開后再按點號(及esc+.)
如:
[root@localhost ~]# ls /etc/sysconfig/network-scripts/ifcfg-eno16777736
/etc/sysconfig/network-scripts/ifcfg-eno16777736
[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno16777736 //cat后輸入esc+. ,會自動補充參數。
c2)、通過!$來實現:
如:
[root@localhost ~]# ls /etc/sysconfig/network-scripts/ifcfg-eno16777736
[root@localhost ~]# cat !$ //
cat /etc/sysconfig/network-scripts/ifcfg-eno16777736
d)、控制歷史命令記錄的方法:
環境變量:HISTCONTROL
如:
[root@localhost ~]# echo $HISTCONTROL
ignoredups //忽略重復的命令,重復是指緊挨著的兩個命令一樣,如果中間有間隔則不算。
[root@localhost ~]#
HISTCONTROL變量有三種值:
ignoredups:忽略重復的值
ignorespace:忽略以空白字符開頭的命令
ignoreboth:同時忽略兩種以上情況
如:
[root@localhost ~]# HISTCONTROL=ignorespace //改變命令歷史的變量的值。
[root@localhost ~]# echo $HISTCONTROL
ignorespace //命令歷史不記錄以空白字符開頭的命令
[root@localhost ~]#
2、命令補全:(tab)
shell程序在接收到用戶執行命令的請求時,分析完成之后,最左側的字符串會被當做命令執行:
命令查找處理機制:
查找內部命令:根據PATH環境變量中設定的目錄,自左向右查找目錄下的文件名:
3、路徑補全:(tab)
根據給定的起始路徑下的字符串開頭來補全。
4、命令行展開機制:
a)、~: 自動展開為用戶的家目錄,或者指定用戶的家目錄。
b)、{ } :可承載一個以逗號(,)分隔的路徑列表,并能夠將其展開為多個路徑
如:/tmp/{a,b} 相當于/tmp/a;/tmp/b
5、#echo $?:命令執行的狀態結果(bash通過狀態返回值來輸出結果)
狀態返回值:
成功:0
失敗:1-255
命令執行完成之后,其狀態返回值會保存于bash的特殊變量$?中,且只能獲得最近那條命令的執行結果:
如:
[root@localhost ~]# ls -ld /etc
drwxr-xr-x. 163 root root 12288 11月 13 14:49 /etc
[root@localhost ~]# echo $?
0
[root@localhost ~]# ls /ett
ls: 無法訪問/ett: 沒有那個文件或目錄
[root@localhost ~]# echo $?
2
[root@localhost ~]# ecc /ec
bash: ecc: 未找到命令...
相似命令是: 'esc'
[root@localhost ~]# echo $?
127
[root@localhost ~]#
6、引用命令的執行結果:
方法一:$(command) :$符號加上命令;
方法二:`command': 反引號括起來的命令;(一般不用此格式)
如:
[root@localhost ~]# date +%T
15:12:03
[root@localhost ~]# date +%H-%M-%S
15-12-37
[root@localhost ~]# date
2016年 11月 13日 星期日 15:12:45 CST
[root@localhost ~]# mkdir $(date +%H-%M-%S) //運行引用命令時,先執行$后命令date +%H-%M-%S,將其結果作為變量 ,作為mkdir的參數執行。
[root@localhost ~]# ls
15-14-09 anaconda-ks.cfg initial-setup-ks.cfg 公共 模板 視頻 圖片 文檔 下載 音樂 桌面
[root@localhost ~]#
[root@localhost ~]# mkdir `date +%H-%M-%S`
[root@localhost ~]# ls
15-14-09 15-19-26 anaconda-ks.cfg initial-setup-ks.cfg 公共 模板 視頻 圖片 文檔 下載 音樂 桌面
[root@localhost ~]#
7:bash的引用:
a)、強引用(' '):任何字符串不做替換
b)、弱引用(" "):變量字符串會做替換
c)、命令引用$(command):
8、bash快捷鍵:
a)、ctrl+a:跳轉至命令的開始位置;
b)、ctrl+e:跳轉至命令行尾;
c)、ctrl+u:刪除命令行首至光標位置的字符;
d)、ctrl+k:刪除光標位置至行尾的字符;
e)、ctrl+l:清屏,相當于clear
9、變量:命名的內存空間。
變量存儲類型:×××、浮點型、字符型、布爾型、日期時間型
變量對計算機來說只有兩種:字符型、數值型(精確數值,近似數值)
變量類型確定了變量的存儲格式、數據范圍、參與的運算;
10、文件名通配(globbing)
匹配模式:通過元字符來實現;元字符有:*、?、[ ]、[^ ]
*: 匹配任意長度的任意字符;
?: 匹配任意單個字符;
[ ]: 匹配指定范圍內的單個字符;
[a-z],[A-Z]:不區分大小寫,匹配a-z中任意單個字母
[0-9]:匹配0-9中的任意單個數字
[a-z0-9]:匹配a-z0-9中的任意單個字符(不區分大小寫)
[abcdefg]:匹配abcdefg中任意一個字符。如:pa[0-9][0-9]:以pa開頭的后接兩個數字
[[:upper:]]:任意大寫A-Z字母中一個(外面的[ ]表示范圍,里面的[:upper:]表示大寫字母集合,以下雷同);如:[[:upper:]][0-9]:表示以任意單個大寫字母開頭后接一個數字的文件。
[[:lower:]]:表示所有的小寫字母中的單個字符;
[[:alpha:]]:表示所有字母中的一個,相當于[[:upper:][:lower:]];
[[:digit:]]:表示所有數字中的一個;
[[:alnum:]]表示所有的字母和數字中的一個;
[[:space:]]:表示所有空白字符中的一個;
[[:punct:]]:所有標點符號中的一個;
[^ ]:匹配指定范圍外的單個字符;
[^[:upper:]]: 匹配非大寫字母中的一個字符
[^0-9]:匹配非0-9中的單個字符
[^[:alnum:]]:匹配非正常字符(字母和數字為正常字符)的單個字符
11、IO重定向
可用于輸入的設備:文件(鍵盤、文件設備、網卡等)
可用于輸出的設備:文件(顯示、文件設備、網卡等)
程序數據流:
輸入數據流:標準輸入 鍵盤
輸出數據流:標準輸出 顯示器
錯誤輸出流:錯誤輸出 顯示器
標準輸入 0; 標準輸出1 ;錯誤輸出2;
a1)、輸出重定向: >(用大于號表示(覆蓋目標文件);輸出重定向的標準輸出是顯示器,現在讓它輸出到其他地方)
a2)、輸出重定向: >>(用兩個大于號表示(追加輸出到目標文件);輸出重定向的標準輸出是顯示器,現在讓它輸出到其他地方)
如:
[root@localhost ~]# cat /etc/passwd > user //將輸出到顯示器上的東西輸出到user文件。
[root@localhost ~]# cat /etc/passwd /dev/tty1 //將輸出結果重定向到虛擬終端tty上。(主要安全,)
a3)、#set -C :禁止覆蓋輸出重定向至已存在的文件。強制覆蓋>|
#set +C:啟用覆蓋輸出重定向;
注意:> ; >>僅對正確的輸出重定向
b)、錯誤輸出重定向:2> ; 2>>
c1)、合并正常輸出流和錯誤輸出流:&>; &>>
c2)、合并正常輸出流和錯誤輸出流:command > /path/to/somefile 2>&1
合并正常輸出流和錯誤輸出流:command >> /path/to/somefile 2>&1
特殊設備:/dev/null
d1)、輸入重定向:<
tr命令:轉換或刪除字符:(只能從標準輸入中取值,不會修改原文件)
tr [OPTION]... SET1 [SET2]
把輸入的數據當中的字符,凡是在set1定義范圍內出現的字符,通通一對一的轉換為set2出現的字符
如:tr abc ABC //將a換成A,將b換成B,將c換成C;
[root@localhost ~]# tr [a-z] [A-Z] < /etc/passwd
[root@localhost ~]# tr -d 'abc' < /etc/issue //刪除重定向輸入中的指定字符abc
\S
Kernel \r on n \m
[root@localhost ~]#
d2)、輸入重定向:<< (存檔用)
#cat > /path/to/somewhere <<eof //表示輸入時遇到eof停止輸入,將此前輸入的數據保存到somewhere中。(注意;eof可換成自己想要的字符)
12、| 管道命令:前一個命令的輸出作為下一個命令的輸入。(tee命令管道分發作用)
command1 | command2 | ......
如:
[root@localhost ~]# cat /etc/issue | tr 'a-z' 'A-Z' //cat的輸出作為tr的輸入
\S
KERNEL \R ON AN \M
[root@localhost ~]#
[root@localhost ~]# cat /etc/issue | tee /tmp/issue.tee | tr 'a-z' 'A-Z' //將cat命令輸出給tee,tee保留一份到/tmp/issue.tee,并另一份給tr做輸入
\S
KERNEL \R ON AN \M
[root@localhost ~]#
tee:command | tee /path/to/somewhere, tee輸出一份到屏幕,保留一份到文件somewhere。
13、命令hash:緩存或顯示此前命令的位置。(命令的執行順序先從hash緩存中查找,如果沒有,在從$PATH環境命令中從左至右一次查找。
[root@promote ~]# ls -d /etc
/etc
[root@promote ~]# tail -1 /etc/passwd
fedora:x:1002:1002::/users/fedora:/bin/bash
[root@promote ~]# hash
hits command
1 /usr/bin/tail
1 /usr/bin/ls
[root@promote ~]#
[root@promote ~]# type hash //查看hash命令類型
hash is a shell builtin
[root@promote ~]# help hash //查看內部命令幫助
hash: hash [-lr] [-p pathname] [-dt] [name ...]
#hash -d:忘記hash命令
#hash -r:清空hash命令 //當命令移到其他位置時,需要清空緩存。
14、shell變量:
變量賦值:name=value
變量類型:變量存儲值得類型,為了防止變量在內存中溢出,需要定義類型。變量類型決定了變量的存儲格式,數據范圍和參與的運算。
變量語言:強類型變量語言、弱類型變量語言。
bash是一種弱類型變量,他把所有變量類型視作字符型,bash變量不支持浮點型;bash中的變量不用事先申明。
變量替換:把變量名出現的位置替換為其所指向內存中的數據。
變量引用:${var_name}或$var_name
變量命名規范:由字母、數字、下劃線一種或多種組成,不能以數字開頭。
bash變量類型根據作用范圍劃分:本地變量、環境變量、局部變量、位置參數變量、特殊變量。
本地變量:作用于僅為當前shell進程
環境變量:作用域為當前shell進程及子進程;
局部變量:作用域僅為某代碼片段;
位置參數變量:用于在shell腳本內部,向執行腳本傳遞的參數;
特殊變量:shell內置的有特殊功用的變量(如:$?)
變量定義的方式:
本地變量:
變量賦值:name=value
變量引用:${name},或$name
" " :弱引用,變量名會替換為值
' ':強引用,變量名不會替換為值
查看變量:set
變量撤銷:unset name //不要加$
環境變量:
變量賦值一:export name=value
變量賦值二 :name=value
export value
變量賦值三: declare -x name=value
變量賦值四: name=value
declare -x name
變量引用:${name},或$name
注意:bash內置了許多環境變量(通常為全大寫字母),用于定義bash的工作環境。(如:PATH\HISTFILE\HISTSIZE\SHELL\PWD\HOME\UID
查看變量:export、delcare -x、printenv、env(都可以查看)
變量撤銷:unset name //不要加$
查看進程樹:pstree
定義只讀變量一:delcare -r name //變成只讀變量將無法撤銷,不能改變值,存活為當前shell生命周期。
定義只讀變量二:readonly name //變成只讀變量將無法撤銷,不能改變值,存活為當前shell生命周期。
15、多命令執行:
格式:#命令1;命令2;命令n;..... //命令先后執行,命令之間沒有邏輯執行。
邏輯運算:
與、或、非、異或;
短路運算:
#COMMAND1 && COMMANG2 //command1為假,則后面的命令不在執行,否則,必須執行
#COMMAND1 || COMMAND2 //command1為真,則后面的命令不執行,否則,必須執行后面的命令
如:
[root@promote ~]# touch abc.txt && tail -1 /etc/passwd > abc.txt //如果前面的命令為真,執行后面的
[root@promote ~]# echo $?
0
[root@promote ~]# cat abc.txt
fedora:x:1002:1002::/users/fedora:/bin/bash
[root@promote ~]#
[root@promote ~]# id username || useradd username //如果前面的命令為假,則執行后面的命令。
id: username: no such user
[root@promote ~]# id username
uid=1003(username) gid=1003(username) groups=1003(username)
[root@promote ~]#
16、shell腳本編程:
編程語言分類:(根據運行方式劃分)
編譯運行:源代碼--->編譯器(編譯成二進制文件)--->程序文件 //如c語言
解釋運行:源代碼--->運行時啟動解釋器,由解釋器邊解釋邊運行; //
根據其編程過程中調用庫文件還是外部的程序文件劃分:
shell腳本編程:利用系統上的命令及編程組件進行編程。
完整編程:通過調用庫文件或依靠程序本身進行編程。
編程模型:過程式編程語言、面向對象的編程語言
程序=指令+數據
過程式編程語言:以指令為中心來組織代碼,數據是服務于代碼;(順序執行;選擇執行;循環執行);如c語言,bash,c++,python
面向對象編程語言: 以數據為中心來組織代碼,圍繞數據來組織指令。(對象:類,方法);如:java,c++,python
shell腳本編程:過程式編程、解釋編程、依賴外部程序文件運行:
編寫shell腳本:
腳本文件的第一行,頂格:給出shebang,解釋器路徑,用于指明解釋執行當前腳本的解釋器程序文件。
常見的解釋器:
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
腳本就是命令的堆積,腳本中的空白行會被忽略,同時,除了shebang,其他以#開頭的行都會被認為注釋行而被忽略。
運行腳本:(shell腳本運行是在shell子進程下實現的)
(1)、賦予腳本執行權限,并直接運行此程序文件。
#chmod +x /path/to/script_file
#./script_file或/path/to/script_file
(2)、#bash script_file //直接運行解釋器,將腳本以命令行參數傳遞給解釋器程序,此時script_file可以去掉執行權限。
文本編輯器:
行編輯器:sed
全屏編輯器:nano、vi、vim
17、bash的配置文件:(所有在命令行中的定義的變量或參數,都會隨著shell的終止而終止,如果希望定義的參數一直在,可以通過更改bash配置文件來實現。)
bash配置文件有兩類:profile類、bashrc類。
profile類:為交互式登錄的shell提供配置。
bashrc類:為非交換式登錄的shell提供配置。
登錄類型:
交互式登錄shell進程:直接通過某終端(tty\pts\ttys等)輸入賬號和密碼后登錄打開的shell進程;使用su - username或者su -l username執行的登錄切換。
非交換式登錄shell進程:使用su username執行的登錄切換;圖形界面下打開的終端;運行腳本;
profile類:(全局profile類、用戶個人profile類)根據生效范圍劃分
全局profile類:對所有用戶都生效;/etc/profile、/etc/profile.d/*.sh
個人profile類:只對單個用戶生效;~/.bash_profile(個人家目錄下的)
profile類的功能:1、用于定義環境變量;2、運行命令或腳本
交互式配置文件讀取次序:/etc/profile--->/etc/profile.d/*--->~/.bash_profile--->~/.bashrc--->/etc/bashrc
bashrc類:(全局bashrc類、用戶個人bashrc類)根據生效范圍劃分
全局bashrc類:/etc/bashrc
用戶個人bashrc類:~/.bashrc(個人家目錄下)
bashrc類的功能:1、定義本地變量;2、定義命令別名
非交換式配置文件讀取次序:~/.bashrc--->/etc/bashrc--->/etc/profile.d/*
備注:僅有管理員有權限修改全局
命令行中定義的特性,如變量和別名作用域為當前shell進程的生命周期;配置文件定義的特性,只對隨后新啟動的shell進程有效。
讓通過配置文件定義的特性立即生效:
1)、通過命令行重復定義一次
2)、讓shell進程重讀配置文件;
#source /PATH/FROM/CONF_FILE
或#. /PATH/FROM/CONF_FILE(如:#. .bashrc)
18、bash腳本編程之算術運算:(+、-、*、/、%、**等)
linux中會把變量視為字符型數據,定義兩個×××變量相加,輸出仍會是字符型;如:
[root@promote tmp]# num1=1
[root@promote tmp]# num2=2
[root@promote tmp]# echo $num1+$num2
1+2
[root@promote tmp]# echo "$num1+$num2"
1+2
[root@promote tmp]#
算術運算格式:乘法符號可能需要轉義符
1)let
[root@promote tmp]# help let
let: let arg [arg ...]
Evaluate arithmetic expressions.
如:
[root@promote tmp]# num1=1
[root@promote tmp]# num2=2
[root@promote tmp]# let sum=$num1+$num2
[root@promote tmp]# echo $sum
3
[root@promote tmp]#
2)$[算術運算表達式]
3)$((算術運算表達式))
4)expr 變量1 運算符 變量2 //需要空格,不常用
如:
[root@promote tmp]# num1=1
[root@promote tmp]# num2=2
[root@promote tmp]# expr $num1 + $num2
3
[root@promote tmp]# sum=$(expr $num1 + $num2)
[root@promote tmp]# echo $sum
3
[root@promote tmp]#
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。