目錄 1. "基本操作" 1.1. "文件操作" 1.2. "文本操作" 1.3. "目錄操作" 1.4. "SSH, 系統信息 & 網路操作" 2. "基本 Shell 編程" 2.1. "變數" 2.2. "字元串替換" 2.3. "函數" 2.4. "條件" 2.5. "迴圈" 3. "技巧" ...
目錄
- 基本操作
1.1. 文件操作
1.2. 文本操作
1.3. 目錄操作
1.4. SSH, 系統信息 & 網路操作
- 基本 Shell 編程
2.1. 變數
2.2. 字元串替換
2.3. 函數
2.4. 條件
2.5. 迴圈
- 技巧
- 調試
1. Basic Operations
a. export
顯示所有的環境變數,如果你想獲取某個變數的詳細信息,使用 echo $VARIABLE_NAME
.
export
Example:
$ export
SHELL=/bin/zsh
AWS_HOME=/Users/adnanadnan/.aws
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LESS=-R
$ echo $SHELL
/usr/bin/zsh
b. whereis
whereis使用系統自動構建的資料庫來搜索可執行文件,源文件和手冊頁面。
whereis name
Example:
$ whereis php
/usr/bin/php
c. which
它在環境變數PATH指定的目錄中搜索可執行文件。此命令將列印可執行文件的完整路徑。
which program_name
Example:
$ which php
/c/xampp/php/php
d. clear
清除視窗上的內容。
1.1. File Operations
ls | touch | cat | more | head | tail | mv | cp | rm | diff |
chmod | gzip | gunzip | gzcat | lpr | lpq | lprm |
a. ls
列出您的文件。ls
有很多選項:-l
列出“長格式”的文件,其中包含文件的確切大小,擁有該文件的人員,有權查看該文件,以及何時進行上次修改。-a
列出所有文件,包括隱藏文件。有關此命令的更多信息,請檢查此鏈接。
ls option
Example:
$ ls -al
rwxr-xr-x 33 adnan staff 1122 Mar 27 18:44 .
drwxrwxrwx 60 adnan staff 2040 Mar 21 15:06 ..
-rw-r--r--@ 1 adnan staff 14340 Mar 23 15:05 .DS_Store
-rw-r--r-- 1 adnan staff 157 Mar 25 18:08 .bumpversion.cfg
-rw-r--r-- 1 adnan staff 6515 Mar 25 18:08 .config.ini
-rw-r--r-- 1 adnan staff 5805 Mar 27 18:44 .config.override.ini
drwxr-xr-x 17 adnan staff 578 Mar 27 23:36 .git
-rwxr-xr-x 1 adnan staff 2702 Mar 25 18:08 .gitignore
b. touch
創建或更新您的文件。
touch filename
Example:
$ touch trick.md
c. cat
它可以在UNIX或Linux下用於以下目的。
- 在屏幕上顯示文本文件
- 複製文本文件
- 合併文本文件
- 創建新的文本文件
cat filename
cat file1 file2
cat file1 file2 > newcombinedfile
d. more
顯示文件的第一部分(用空格移動並鍵入q以退出)。
more filename
e. head
輸出文件的前10行。
head filename
f. tail
輸出最後10行文件。用於-f在文件增長時輸出附加數據。
tail filename
g. mv
將文件從一個位置移動到另一個位置。
mv filename1 filename2
filename1
文件的源路徑,filename2
是目標路徑。
h. cp
將文件從一個位置複製到另一個位置。
cp filename1 filename2
filename1
文件的源路徑,filename2
是目標路徑。
i. rm
刪除文件。在目錄上使用此命令會給您顯示一個錯誤: rm: directory: is a directory
。 為了刪除目錄,你必須傳遞-rf
去遞歸刪除目錄中的所有內容。
rm filename
j. diff
比較文件,併列出他們的差異。
diff filename1 filename2
k. chmod
讓您更改文件的讀取,寫入和執行許可權。
chmod -options filename
l. gzip
壓縮文件。
gzip filename
m. gunzip
解壓縮gzip壓縮的文件。
gunzip filename
n. gzcat
讓你查看gzip壓縮文件,而不需要gunzip它。
gzcat filename
o. lpr
列印文件。
lpr filename
p. lpq
查看印表機隊列。
lpq
Example:
$ lpq
Rank Owner Job File(s) Total Size
active adnanad 59 demo 399360 bytes
1st adnanad 60 (stdin) 0 bytes
q. lprm
從列印隊列移除某些內容。
lprm jobnumber
1.2. Text Operations
awk | grep | wc | sed | sort | uniq | cut | echo | fmt |
tr | nl | egrep | fgrep |
a. awk
awk是處理文本文件最有用的命令。它一行一行地在整個文件上運行。預設情況下,它使用空格分隔欄位。awk命令最常用的語法是
awk '/search_pattern/ { action_to_take_if_pattern_matches; }' file_to_parse
讓我們採取以下文件 /etc/passwd
。以下是此文件包含的示例數據:
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
所以現在讓我們從這個文件只獲取用戶名。 -F
指定在我們要基於哪個分隔欄位。在我們的例子中 :
。{ print $1 }
意味著列印出第一個匹配欄位。
awk -F':' '{ print $1 }' /etc/passwd
運行上述命令後,您將獲得以下輸出。
root
daemon
bin
sys
sync
有關如何使用awk
的更多細節,請查看以下鏈接。
b. grep
查找文件內的文本。您可以使用grep搜索與一個或多個正則表達式匹配的文本行,並僅輸出匹配的行。
grep pattern filename
Example:
$ grep admin /etc/passwd
_kadmin_admin:*:218:-2:Kerberos Admin Service:/var/empty:/usr/bin/false
_kadmin_changepw:*:219:-2:Kerberos Change Password Service:/var/empty:/usr/bin/false
_krb_kadmin:*:231:-2:Open Directory Kerberos Admin Service:/var/empty:/usr/bin/false
您還可以通過使用-i
選項強制grep忽略單詞大小寫。-r
可用於搜索指定目錄下的所有文件,例如:
$ grep -r admin /etc/
-w
只搜索單詞。有關grep
詳細信息,請查看以下鏈接。
c. wc
告訴你一個文件中有多少行,多少單詞和多少字元。
wc filename
Example:
$ wc demo.txt
7459 15915 398400 demo.txt
7459
是行數, 15915
是單詞數, 398400
是字元數.
d. sed
用於過濾和轉換文本的流編輯器。
example.txt
Hello This is a Test 1 2 3 4
用連字元替換所有空格
sed 's/ /-/g' example.txt
Hello-This-is-a-Test-1-2-3-4
使用"d"替換所有的數字
sed 's/[0-9]/d/g' example.txt
Hello This is a Test d d d d
e. sort
排序文本文件的行
example.txt
f
b
c
g
a
e
d
sort example.txt
sort example.txt
a
b
c
d
e
f
g
隨機化一個排序的example.txt
sort example.txt | sort -R
b
f
a
c
d
g
e
f. uniq
報告或省略重覆的行
example.txt
a
a
b
a
b
c
d
c
只顯示example.txt的唯一行(首先你需要排序,否則看不到重疊)
sort example.txt | uniq
a
b
c
d
顯示每行的唯一項,並告訴我找到了多少個實例
sort example.txt | uniq -c
3 a
2 b
2 c
1 d
g. cut
從每行文件中刪除部分。
example.txt
red riding hood went to the park to play
顯示第2,7和9欄的空格作為分隔符
cut -d " " -f2,7,9 example.txt
riding park play
h. echo
顯示一行文字
顯示 "Hello World"
echo Hello World
Hello World
用字母之間的換行顯示 "Hello World"
echo -ne "Hello\nWorld\n"
Hello
World
i. fmt
簡單的最佳文本格式化程式
example: example.txt (1 line)
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
將example.txt的行輸出為20個字元的寬度
cat example.txt | fmt -w 20
Lorem ipsum
dolor sit amet,
consetetur
sadipscing elitr,
sed diam nonumy
eirmod tempor
invidunt ut labore
et dolore magna
aliquyam erat, sed
diam voluptua. At
vero eos et
accusam et justo
duo dolores et ea
rebum. Stet clita
kasd gubergren,
no sea takimata
sanctus est Lorem
ipsum dolor sit
amet.
j. tr
翻譯或刪除字元
example.txt
Hello World Foo Bar Baz!
把所有小寫字母變成為大寫
cat example.txt | tr 'a-z' 'A-Z'
HELLO WORLD FOO BAR BAZ!
把所有的空格變成換行符
cat example.txt | tr ' ' '\n'
Hello
World
Foo
Bar
Baz!
k. nl
顯示文件的行數
example.txt
Lorem ipsum
dolor sit amet,
consetetur
sadipscing elitr,
sed diam nonumy
eirmod tempor
invidunt ut labore
et dolore magna
aliquyam erat, sed
diam voluptua. At
vero eos et
accusam et justo
duo dolores et ea
rebum. Stet clita
kasd gubergren,
no sea takimata
sanctus est Lorem
ipsum dolor sit
amet.
帶行號顯示 example.txt
nl -s". " example.txt
1. Lorem ipsum
2. dolor sit amet,
3. consetetur
4. sadipscing elitr,
5. sed diam nonumy
6. eirmod tempor
7. invidunt ut labore
8. et dolore magna
9. aliquyam erat, sed
10. diam voluptua. At
11. vero eos et
12. accusam et justo
13. duo dolores et ea
14. rebum. Stet clita
15. kasd gubergren,
16. no sea takimata
17. sanctus est Lorem
18. ipsum dolor sit
19. amet.
l. egrep
列印匹配模式的行 - 擴展表達式(別名為:'grep -E')
example.txt
Lorem ipsum
dolor sit amet,
consetetur
sadipscing elitr,
sed diam nonumy
eirmod tempor
invidunt ut labore
et dolore magna
aliquyam erat, sed
diam voluptua. At
vero eos et
accusam et justo
duo dolores et ea
rebum. Stet clita
kasd gubergren,
no sea takimata
sanctus est Lorem
ipsum dolor sit
amet.
在其中顯示“Lorem”或“dolor”的行
egrep '(Lorem|dolor)' example.txt
or
grep -E '(Lorem|dolor)' example.txt
Lorem ipsum
dolor sit amet,
et dolore magna
duo dolores et ea
sanctus est Lorem
ipsum dolor sit
m. fgrep
列印匹配模式到的行 - FIXED模式匹配(別名為:'grep -F')
example.txt
Lorem ipsum
dolor sit amet,
consetetur
sadipscing elitr,
sed diam nonumy
eirmod tempor
foo (Lorem|dolor)
invidunt ut labore
et dolore magna
aliquyam erat, sed
diam voluptua. At
vero eos et
accusam et justo
duo dolores et ea
rebum. Stet clita
kasd gubergren,
no sea takimata
sanctus est Lorem
ipsum dolor sit
amet.
在example.txt中找到具體的字元串'(Lorem | doloar)'
fgrep '(Lorem|dolor)' example.txt
or
grep -F '(Lorem|dolor)' example.txt
foo (Lorem|dolor)
1.3. Directory Operations
mkdir | cd | pwd |
a. mkdir
生成一個新的目錄。
mkdir dirname
b. cd
執行這個,從一個目錄轉移到另外一個目錄。
$ cd
將你移動到主目錄。此命令接受可選的dirname
,將你移動到該目錄。
cd dirname
c. pwd
告訴你你目前所在的目錄。
pwd
1.4. SSH, System Info & Network Operations
ssh | whoami | passwd | quota | date | cal | uptime | w | finger | uname |
man | df | du | last | ps | kill | killall | top | bg | fg |
ping | whois | dig | wget | scp |
a. ssh
ssh (SSH client) 是一個用來在登錄到遠程機器並執行的命令的程式。
ssh user@host
此命令還接受-p
可用於連接到特定埠的選項。
ssh -p port user@host
b. whoami
返回當前登錄用戶名。
c. passwd
允許當前登錄的用戶更改其密碼。
d. quota
顯示您的磁碟配額。
quota -v
e. date
顯示當前日期和時間。
f. cal
顯示月份的日曆。
g. uptime
顯示當前的正常運行時間。
h. w
顯示誰線上
i. finger
Displays information about user.
finger username
j. uname
顯示內核信息。
uname -a
k. man
顯示指定命令的手冊。
man command
l. df
顯示磁碟使用情況。
m. du
顯示文件名中文件和目錄的磁碟使用情況(du -s只給出一個總數)。
du filename
n. last
列出您最後登錄的指定用戶。
last yourUsername
o. ps
列出您的進程。
ps -u yourusername
p. kill
使用您所提供的ID殺死(結束)進程。
kill PID
q. killall
用名稱殺死所有進程。
killall processname
r. top
顯示當前活動的進程。
s. bg
列出停止的或後臺工作的Job; 恢覆在後臺停止的Job。
t. fg
前臺化最近的Job。
Brings the most recent job in the foreground.
u. ping
Pings主機並輸出結果。
ping host
v. whois
獲取域的whois信息。
whois domain
w. dig
獲取域的DNS信息。
dig domain
x. wget
下載文件。
wget file
y. scp
在本地主機和遠程主機之間或兩台遠程主機之間傳輸文件。
從本地主機複製到遠程主機
scp source_file user@host:directory/target_file
從遠程主機複製到本地主機
scp user@host:directory/source_file target_file
scp -r user@host:directory/source_folder farget_folder
此命令還接受-P
選項可用於連接到特定的埠。
scp -P port user@host:directory/source_file target_file
2. Basic Shell Programming
在bash中你將編寫第一行腳本文件,被叫做shebang
。任何腳本中的這一行來確定腳本的執行能力,如獨立的可執行文件,而不是在終端中預先鍵入sh,bash,python,php等。
#!/bin/bash
2.1. Variables
在bash中創建變數與其他語言類似。沒有數據類型。bash中的變數可以包含數字,字元,字元串等。您無需聲明變數,只需為其引用分配一個值即可創建它。
Example:
str="hello world"
上面的一行創建一個變數str並給它賦值“hello world”。通過$
放在變數名的開頭來檢索變數的值。
Example:
echo $str # hello world
像其他語言一樣,bash也有數組。數組是包含多個值的變數。數組的大小沒有最大限制。bash中的數組為零。第一個元素被索引為元素0.在bash中創建數組有幾種方法。以下給出了哪些。
Examples:
array[0] = val
array[1] = val
array[2] = val
array=([2]=val [0]=val [1]=val)
array(val val val)
要在特定索引處顯示值,請使用以下語法:
${array[i]} # where i is the index
如果沒有提供索引,則假定為數組元素0。要瞭解數組中有多少值,請使用以下語法:
${#array[@]}
Bash也支持三元條件。下麵是一些例子。
${varname:-word} # 如果varname存在且不為null,則返回其值; 否則返回word
${varname:=word} # 如果varname存在且不為null,則返回其值;否則設置它,然後返回其值
${varname:+word} # 如果varname存在並且不為null,返回word; 否則返回null
${varname:offset:length} # 執行子字元串擴展。它返回$ varname的子字元串,從offset開始,最多為length的字元
2.2 String Substitution
檢查一些關於如何操作字元串的語法
${variable#pattern} # if the pattern matches the beginning of the variable's value, delete the shortest part that matches and return the rest
${variable##pattern} # if the pattern matches the beginning of the variable's value, delete the longest part that matches and return the rest
${variable%pattern} # if the pattern matches the end of the variable's value, delete the shortest part that matches and return the rest
${variable%%pattern} # if the pattern matches the end of the variable's value, delete the longest part that matches and return the rest
${variable/pattern/string} # the longest match to pattern in variable is replaced by string. Only the first match is replaced
${variable//pattern/string} # the longest match to pattern in variable is replaced by string. All matches are replaced
${#varname} # returns the length of the value of the variable as a character string
2.3. Functions
幾乎與任何編程語言一樣,您可以使用函數以更邏輯的方式對代碼段進行分組,或者實踐遞歸的神聖藝術。聲明函數只是編寫函數my_func {my_code}的問題。調用一個函數就像調用另一個程式一樣,你只需要寫上它的名字。
functname() {
shell commands
}
Example:
#!/bin/bash
function hello {
echo world!
}
hello
function say {
echo $1
}
say "hello world!"
當您運行上述示例時,該hello函數將輸出“world!”。上述兩個功能hello
和say
是相同的。主要區別是功能say
。此功能列印其接收到的第一個參數。函數內的參數以與給腳本的參數相同的方式進行處理。
2.4. Conditionals
bash中的條件語句與其他編程語言相似。條件有許多形式,如最基本的形式是if
表達式then
語句,其中語句只有在表達式為真時執行。
if [expression]; then
will execute only if expression is true
else
will execute if expression is false
fi
有時,如果條件變得混亂,所以你可以使用相同的條件case statements
。
case expression in
pattern1 )
statements ;;
pattern2 )
statements ;;
...
esac
Expression Examples:
statement1 && statement2 # 兩邊的條件都為true
statement1 || statement2 # 其中一邊為true
str1=str2 # str1 匹配 str2
str1!=str2 # str1 不匹配 str2
str1<str2 # str1 是否小於 str2
str1>str2 # str1 是否大於 str2
-n str1 # str1 不為空(長度大於 0)
-z str1 # str1 為空(長度為 0)
-a file # 文件存在
-d file # 文件存在,是一個目錄
-e file # 文件存在; 相同的-a
-f file # 文件存在,是一個常規文件(即不是目錄或其他特殊類型的文件)
-r file # 你有讀許可權
-r file # 文件存在,不為空
-w file # 你有寫許可權
-x file # 你有文件的執行許可權
file1 -nt file2 # file1 is newer than file2
file1 -ot file2 # file1 is older than file2
-lt # 小於
-le # 小於或等於
-eq # 等於
-ge # 大於或等於
-gt # 大於
-ne # 不等於
2.5. Loops
bash 中有三種不同類型的迴圈。 for
, while
和 until
.
for
語法:
for x := 1 to 10 do
begin
statements
end
for name [in list]
do
statements that can use $name
done
for (( initialisation ; ending condition ; update ))
do
statements...
done
while
語法:
while condition; do
statements
done
until
語法:
until condition; do
statements
done
3. Tricks
設置一個別名
bash_profile
可以通過運行後面的命令打開。 nano ~/.bash_profile
alias dockerlogin='ssh [email protected] -p2222' # add your alias in .bash_profile
快速去特定的目錄
nano ~/.bashrc
export hotellogs="/workspace/hotel-api/storage/logs"
source ~/.bashrc
cd hotellogs
4. Debugging
您可以通過傳遞不同的選項來輕鬆地調試bash腳本bash。例如-n,不會運行命令並僅檢查語法錯誤。-vecho命令在運行它們之前。-x命令行處理後的echo命令。
bash -n scriptname
bash -v scriptname
bash -x scriptname