基本知識
shell提示符和shell腳本文件
-
username@hostname$代表普通用戶,root@hostname#代表超級用戶 - shell腳本文件是以
!#[解釋器路徑]開頭的文件。比如#!/bin/bash - 想要運行shell腳本,可以用解釋器執(zhí)行:
sh script.sh,或者直接執(zhí)行腳本:./script.sh(注意前面的./不能省略)或使用腳本完整路徑:/.../script.sh。直接執(zhí)行腳本需要有可執(zhí)行的權(quán)限,如果沒有的話會zsh: permission denied: ./script.sh。此時需要chmod a+x script.sh。
終端打印:echo、printf
關(guān)于echo
- 每次打印加一個換行符。
- 不帶引號,單引號和雙引號都可以打印,但有細(xì)微的差別:雙引號中不能打印感嘆號'!',需要轉(zhuǎn)義。不帶引號不能打印分號(因為被用作定界符),單引號中的變量$var不會被求值。
- 一些選項:-n:忽略結(jié)尾的換行符;-e:包含轉(zhuǎn)義序列
- 打印彩色的例子
echo -e "\e[1;31m This is red Text. \e[0m",其中最后的\e[0m把顏色重新置回,第一個\e[1;31m把顏色設(shè)置成了紅色
關(guān)于printf
- 和C語言中的printf很相似,注意每次使用都會在結(jié)尾附加一個\n
- 格式:printf "[%[-a][.b][格式替代符:s/c/d/f...]]..." var1 var2...
$ printf "%-3s,%-10s,%-4.2f" 1 Raidriar 2.333333
1 ,Raidriar ,2.33
變量與環(huán)境變量的使用
變量
- 這樣是給變量賦值:
var=value,這樣是判斷相等:var = value - 在變量前面加上
$前綴,即可對變量求值。例如echo $var - 獲得變量長度:
${#var}
環(huán)境變量是未在當(dāng)前進(jìn)程中定義,而是從父進(jìn)程繼承的變量。例如PATH
- export命令可以設(shè)置環(huán)境變量:
export PATH="$PATH:/..." - 還有一些環(huán)境變量
HOME PWD USER UID SHELL
#!/bin/bash
echo $PATH;echo $HOME;echo $PWD;echo $USER;echo $UID;echo $SHELL
# script.sh
raidriarb@Rmbp LinuxShellTest % ./script.sh
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Library/Apple/bin:/Applications/Wireshark.app/Contents/MacOS
/Users/raidriarb
/Users/raidriarb/Desktop/LinuxShellTest #PWD:當(dāng)前工作目錄
raidriarb
501 #UID為0,則為root用戶
/bin/zsh #現(xiàn)在用的shell是哪個
數(shù)學(xué)
文件描述符與重定向
基礎(chǔ)知識
文件描述符是與【一個打開的文件或數(shù)據(jù)流】相關(guān)聯(lián)的【整數(shù)】。IO編程中,我們經(jīng)常使用到stdin,stdout,stderr這幾個流,這幾個流的文件描述符是系統(tǒng)預(yù)留的,分別為0,1,2
- 關(guān)于stderr:很多人不知道它是做什么用的,這個流用來打印錯誤信息。它雖然在控制臺中打印了文本,但并非標(biāo)準(zhǔn)輸出stdout的方式打印,否則是區(qū)分不開錯誤信息的文本和正常文本的。
- 命令執(zhí)行成功和不成功是有返回值的,這個返回值通過變量
$?來查看
$ ls +
ls: +: No such file or directory #這是stderr打印的
$ echo $?
1 #不成功
$ echo $?
0 #上一條的echo $? 是成功的
文件重定向的符號有兩個:>和>>。其中前者的輸出方式是“清空”,后者的輸出方式是“追加”。
$ echo "hello1" > hello
$ cat hello
hello1
$ echo "hello2" > hello
$ cat hello
hello2
$ echo -n "hello3" >> hello
$ cat hello
hello2
hello3
當(dāng)然也可以重定向stderr,這里不多演示了。
如果重定向到了這個文件:/dev/null,那么所有的輸出都會被丟棄。這個文件也被稱為黑洞。
管道和tee命令
管道的符號是|,它可以把上一個命令的輸出,作為stdin,傳給下一個命令。注意只有在管道的最后才會被輸出。
$ cat file1 | cat -n
1 this is a line in file1.
2 this is another line.
如果使用了重定向,那么輸出從stdout重定向了,沒有什么東西可以通過管道傳遞給接下來的命令。
命令tee可以提供一種方法,將一份副本寫入重定向的文件,同時把另一份副本傳遞給后續(xù)命令的stdin。
$ cat file1 | tee file1_cp | cat -n
1 this is a line in file1.
2 this is another line.
#既輸出到了文件,又通過管道傳輸給下一個命令
- tee默認(rèn)情況是覆蓋方式寫入文件,但 -a 參數(shù)可以使用追加模式
- stdin也可以作為tee的參數(shù),只要把
-或者/dev/stdin作為文件名參數(shù)即可 - 同樣的,
/dev/stdout,/dev/stderr代表標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤流
其他技巧
別名 alias
- 別名是一種快捷方式,可以替換一長串命令。
- 例如
alias rm 'cp $@ ~/backup; rm $@',可以防止rm -rf從刪庫到跑路 - 一旦關(guān)閉當(dāng)前終端,別名就會失效。如果要持久化,需要將它寫入~/.bashrc文件中:
echo 'alias cmd="command seq"' >> ~/.bashrc - 使用轉(zhuǎn)義命令
\command可以強制使用原命令command,而不是別名,所以強制刪庫跑路也是可以的。。。為了安全起見,建議在不信任的環(huán)境下的命令都加上這個轉(zhuǎn)義序列,因為可能有人在此目錄植入了別名,更換了一些別有用心的命令