你可能不知道的shell技巧

只是一些適當的拋磚,未作深刻討論,不足以當作教程,想完整學習的看官請查閱權威資料!

cd  -

返回上一次進入的目錄。等價於cd $OLDPWDnginx

若是你是剛進入終端界面,就不存在上一次的目錄,那麼執行這個命令將報錯:cd: OLDPWD not set。除非你至少執行過一次cd操做docker

!!

執行上一條命令。shell

echo '原罪'
!!

你會看到兩個原罪express

若是你有一個命令少打了個什麼單詞,那麼這個功能實在是方便:api

原罪大sb
echo !!

history

查看你以前執行過的命令。數組

$?

查看上一個執行的命令的狀態。默認值是0,也就是說沒報錯。
有一個用處就是你能夠用來判斷是否要繼續往下執行bash

if [ "$?" -ne 0 ]
then
  echo "Error and exix"
  exit $?
fi

若是你的程序容不得半點錯誤,並且幾乎每一步你都須要判斷有沒有報錯,那麼改一下模式就行了:服務器

# 設置模式,一旦進程或者子進程返回的狀態不是0,那麼就直接退出
set -e

# 開始執行代碼

test

這是一個內置的檢驗函數,簡寫是:[ 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

pwd -P

查看當前所在目錄,意味着軟連接的目錄將顯示真實的路徑函數

reboot

重啓電腦。危險操做,慎用

reboot

# 若是沒有權限
sudo reboot

set -x

打印出執行的命令,並在命令前加上+號

# vi test.sh
set -x
  
me="Who am i"
echo ${#me}
sh test.sh

# + me='Who am i'
# + echo 8
# 8

: > FILE

置空文件內容並保存。
:實際上是個空操做,能夠單獨使用

if xxx
then
  :
else
  # run  
fi

shift

從左側開始刪除位置參數

# 模擬位置參數
set aa bb cc

echo $@
# aa bb cc

shift
echo $@
# bb cc

shift
echo $@
# cc

CDPATH

和PATH相似,但這個變量是給cd用的。
你想cd進一個目錄,可是這個目錄不在當前工做目錄,那麼shell就會去CDPATH的路徑下找

# PhpstormProjects目錄下有一個 user-api 目錄
CDPATH=$CDPATH:$HOME/PhpstormProjects/

# 當前目錄:$HOME
cd user-api
# 當前目錄:$HOME/PhpstormProjects/user-api

CDPATH能夠放在.bash_profile中

2>&1

輸出重定向,將標準錯誤重定向爲標準輸出
一些logs輸出實際上是走的標準錯誤輸出的,因此你想用管道之類的作額外處理的話,十分抱歉。

# 想查看最後一行的log

# 抱歉。這樣沒法經過管道,直接所有打印出來了
docker logs some-container | tail -1

# 好的。管道正式開放
docker logs some-container 2>&1 | tail -1

有時候,你想捕獲錯誤信息,並使用他,或者存入變量,那麼也可使用輸出重定向。

注意:2>&1 中間不能有空格哦

dirname $0

在shell執行腳本文件中,精確的找到當前文件所在的目錄。

# file.sh

current_dir=$(dirname $0)

cal

快速查看日曆

# 查看當前月的日曆
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

cat > FILE <<

利用行內輸入重定向把內容寫入文件。在作一些自動化腳本的時候比較有用,兼顧了格式化和可讀性。
這種寫法也叫作here document

cat > test.txt <<EOF
你好原罪
  換了一行,還帶空格
十年磨一劍
EOF

好的,test.txt中已經寫入了相關文字,格式一致。不信你就cat test.txt試試。

網上常常看到一些教程,先vi file,而後把某段內容複製進去,而後:wq一下。我去,哪有那麼多時間理你啊。如今,你能夠這麼說:把這段執行一下便可!

grep -v grep

這個看官可能想找某個正在運行的進程

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

設置一個只讀變量。意味着不能再修改了,修改會報錯呦。

readonly me='原罪'

# 打印原罪
echo $me

# 馬上報錯
me='小弟'
# -bash: me: readonly variable

array[*]

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]}
# 原罪

${parameter:?}

要求參數必須填,不然報錯。去除繁瑣的if判斷

# vi test.sh
echo ${1:?}


#shell:
sh test.sh
# test.sh: line 1: 1: parameter null or not set

固然了,也能夠設置報錯內容${parameter:?error_value}

unset

是的,shell變量也能夠刪除(包括函數)

# 變量
aa=123

echo $aa
# 123

unset aa
echo $aa
#
# 函數
testMe () {
  echo 'done'
}

testMe
# done

unset testMe
testMe
#

ssh-copy-id USER@IP

這是一個mac下的命令,就是把公鑰當即部署到服務器對應用戶的 ~/.ssh/authoried_keys 文件中。身邊的朋友都以爲這個命令挺實用的!

相關文章
相關標籤/搜索