只是一些適當的拋磚,未作深刻討論,不足以當作教程,想完整學習的看官請查閱權威資料!
返回上一次進入的目錄。等價於cd $OLDPWD
。nginx
若是你是剛進入終端界面,就不存在上一次的目錄,那麼執行這個命令將報錯:cd: OLDPWD not set
。除非你至少執行過一次cd操做docker
執行上一條命令。shell
echo '原罪' !!
你會看到兩個原罪express
若是你有一個命令少打了個什麼單詞,那麼這個功能實在是方便:api
原罪大sb echo !!
查看你以前執行過的命令。數組
查看上一個執行的命令的狀態。默認值是0,也就是說沒報錯。
有一個用處就是你能夠用來判斷是否要繼續往下執行bash
if [ "$?" -ne 0 ] then echo "Error and exix" exit $? fi
若是你的程序容不得半點錯誤,並且幾乎每一步你都須要判斷有沒有報錯,那麼改一下模式就行了:服務器
# 設置模式,一旦進程或者子進程返回的狀態不是0,那麼就直接退出 set -e # 開始執行代碼
這是一個內置的檢驗函數,簡寫是:[ expression ]
,也就是咱們常在if
中使用的ssh
a=2 test $a -eq 2 echo $? # 0 測試正確 test $a -eq 3 echo $? # 1 測試錯誤 if [ $a -eq 2 ] then # of course fi
查看當前所在目錄,意味着軟連接
的目錄將顯示真實的路徑函數
重啓電腦。危險操做,慎用
reboot # 若是沒有權限 sudo reboot
打印出執行的命令,並在命令前加上+號
# vi test.sh set -x me="Who am i" echo ${#me}
sh test.sh # + me='Who am i' # + echo 8 # 8
置空文件內容並保存。:
實際上是個空操做,能夠單獨使用
if xxx then : else # run fi
從左側開始刪除位置參數
# 模擬位置參數 set aa bb cc echo $@ # aa bb cc shift echo $@ # bb cc shift echo $@ # cc
和PATH相似,但這個變量是給cd用的。
你想cd進一個目錄,可是這個目錄不在當前工做目錄,那麼shell就會去CDPATH的路徑下找
# PhpstormProjects目錄下有一個 user-api 目錄 CDPATH=$CDPATH:$HOME/PhpstormProjects/ # 當前目錄:$HOME cd user-api # 當前目錄:$HOME/PhpstormProjects/user-api
CDPATH能夠放在.bash_profile中
輸出重定向,將標準錯誤重定向爲標準輸出
一些logs輸出實際上是走的標準錯誤輸出的,因此你想用管道之類的作額外處理的話,十分抱歉。
# 想查看最後一行的log # 抱歉。這樣沒法經過管道,直接所有打印出來了 docker logs some-container | tail -1 # 好的。管道正式開放 docker logs some-container 2>&1 | tail -1
有時候,你想捕獲錯誤信息,並使用他,或者存入變量,那麼也可使用輸出重定向。
注意:2>&1 中間不能有空格哦
在shell執行腳本文件中,精確的找到當前文件所在的目錄。
# file.sh current_dir=$(dirname $0)
快速查看日曆
# 查看當前月的日曆 cal 十月 2018 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 # 查看9月日曆 cal 9 2018 九月 2018 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 # 查看一年12個月的日曆 cal 2018
利用行內輸入重定向把內容寫入文件。在作一些自動化腳本的時候比較有用,兼顧了格式化和可讀性。
這種寫法也叫作here document
cat > test.txt <<EOF 你好原罪 換了一行,還帶空格 十年磨一劍 EOF
好的,test.txt中已經寫入了相關文字,格式一致。不信你就cat test.txt
試試。
網上常常看到一些教程,先vi file,而後把某段內容複製進去,而後:wq一下。我去,哪有那麼多時間理你啊。如今,你能夠這麼說:把這段執行一下便可!
這個看官可能想找某個正在運行的進程
ps aux | grep nginx
細心的你會發現,無論有沒有找到nginx相關的進程,都會顯示一個進程
fwh1990 1134 0.0 0.0 4268060 828 s002 S+ 3:52下午 0:00.00 grep nginx
咱們略施小計便可去除這種無用進程
ps aux | grep nginx | grep -v grep
好的,還你一個清爽的輸出。
設置一個只讀變量。意味着不能再修改了,修改會報錯呦。
readonly me='原罪' # 打印原罪 echo $me # 馬上報錯 me='小弟' # -bash: me: readonly variable
shell是有數組的
arr[0]='你好' arr[1]='原罪' arr[2]='哥' echo ${arr[0]} # 你好 echo ${arr[2]} # 哥 echo $arr # 你好 等價於 ${arr[0]} echo ${arr[*]} # 你好 原罪 哥 所有打印
字符串也能夠轉換成數組
arr='你好 原罪 哥' arr=($arr) echo ${arr[1]} # 原罪
要求參數必須填,不然報錯。去除繁瑣的if判斷。
# vi test.sh echo ${1:?} #shell: sh test.sh # test.sh: line 1: 1: parameter null or not set
固然了,也能夠設置報錯內容${parameter:?error_value}
是的,shell變量也能夠刪除(包括函數)
# 變量 aa=123 echo $aa # 123 unset aa echo $aa #
# 函數 testMe () { echo 'done' } testMe # done unset testMe testMe #
這是一個mac下的命令,就是把公鑰當即部署到服務器對應用戶的 ~/.ssh/authoried_keys 文件中。身邊的朋友都以爲這個命令挺實用的!