Linux命令&shell筆記1——基礎(chǔ)篇

基本知識

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)義序列,因為可能有人在此目錄植入了別名,更換了一些別有用心的命令
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,707評論 0 5
  • 一、Python簡介和環(huán)境搭建以及pip的安裝 4課時實驗課主要內(nèi)容 【Python簡介】: Python 是一個...
    _小老虎_閱讀 6,319評論 0 10
  • 本文筆記源自這里——[實驗樓]歡迎大家在下面交流其中有問題的地方喜歡請點收藏,每日更新(全部已親自實踐). 一. ...
    東皇Amrzs閱讀 4,300評論 7 54
  • 1、數(shù)學(xué)運算 在Bash shell環(huán)境中,可以使用let、(())和[]執(zhí)行基本的算術(shù)操作,而在進(jìn)行高級操作時,...
    ruready閱讀 301評論 0 0
  • 1.在終端顯示輸出 1.1 username@hostname$ $表示普通用戶,#表示管理員用戶root 1.2...
    王偵閱讀 648評論 0 0

友情鏈接更多精彩內(nèi)容