Vim學習
Vim的普通模式下按Ctrl+z會把當前開啟的檔案放入後台運行,如果需要恢複到前台來,需要先在shell的命令模式下用jobs命令查看當前環境下所有任務的編號,在用fg %N恢複到前台來,N是對應的後台運行編號。
dw是刪除一個單詞(或者daw),dnw刪除n個單詞。
nx是刪除那個字元,ndd是刪除n行。
命令模式下:set nu 是顯示行號。
nG(n shift+g)將遊標移動到第n行。gg移動到第一行,G(shift+g)移動到最後一行。
命令 |
說明 |
w |
到下一個單詞的開頭 |
e |
到下一個單詞的結尾 |
b |
到前一個單詞的開頭 |
ge |
到前一個單詞的結尾 |
0或^ |
到行頭 |
$ |
到行尾 |
f<字母> |
向後搜尋<字母>並跳轉到第一個匹配的位置(非常實用) |
F<字母> |
向前搜尋<字母>並跳轉到第一個匹配的位置 |
t<字母> |
向後搜尋<字母>並跳轉到第一個匹配位置之前的一個字母(不常用) |
T<字母> |
向前搜尋<字母>並跳轉到第一個匹配位置之後的一個字母(不常用) |
Ps:搜尋字元並跳轉只能在當前行內有效,不能跳轉到下一行。
· 普通模式中使用y複製
o 普通模式中,yy複製遊標所在的整行(3yy表示複製3行)
o 普通模式中,y^ 複製至行首,或y0。不含游標所在處字元。
o 普通模式中,y$ 複製至行尾。含光所在處字元。
o 普通模式中,yw 複製一個單詞。
o 普通模式中,y2w 複製兩個單詞。
o 普通模式中,yG 複製至文本末。
o 普通模式中,y1G 複製至文本開頭。
· 普通模式中使用p粘貼
o 普通模式中,p(小寫)代表粘貼至游標後(下)
o 普通模式中,P(大寫)代表粘貼至游標前(上)
替換和撤銷(Undo)命令
替換和Undo命令都是針對普通模式下的操作
命令 |
說明 |
r+<待替換字母> |
將遊標所在字母替換為指定字母 |
R |
連續替換,直到按下Esc |
cc |
替換整行,即刪除遊標所在行,並進入插入模式 |
cw |
替換一個單詞,即刪除一個單詞,並進入插入模式 |
C(大寫) |
替換遊標以後至行末 |
~ |
反轉遊標所在字母大小寫 |
u{n} |
撤銷一次或n次操作 |
U(大寫) |
撤銷當前行的所有修改 |
Ctrl+r |
redo,即撤銷undo的操作 |
普通模式下直接輸入>>或<<,相當於在游標處之前的地方加一個Tab(又叫跳格符或定位字元),多用於在代碼檔案中調整格式用。
我們可以自己調整Tab的寬度,只要在命令模式下輸入:set shiftwidth=10 ,將一個Tab的距離設定成10個字元的寬度,但只是改>>的寬度,並不能改編輯模式下的Tab寬度,編輯模式下的一個Tab通常預設的是8個字元寬。
關於尋找
普通模式下輸入/然後鍵入需要尋找的字串按斷行符號後就會進行尋找。。與/功能相同,只不過。是向上而/是向下尋找。進入尋找之後,輸入n和N可以繼續尋找 n表示繼續尋找,N反向尋找。
普通模式下輸入\*尋找遊標所在處的單詞
普通模式下輸入\#同上,但 \* 是向前(上)找,#則是向後(下)找
普通模式下輸入g\*同\* ,但部分符合該單詞即可
普通模式下輸入g\#同\# ,但部分符合該單詞即可
恢複文檔與加密文檔
如果因為斷電等原因造成文檔沒有儲存,可以採用恢複方式,vim -r進入文檔後,輸入:ewcover 1.txt來恢複
$ vim -x file1
如果檔案之前沒有密碼,則會需要輸入您的密碼再輸入一次確認密碼,這樣在下一次開啟時,vim就會要求你輸入密碼。
如果需要解除檔案密碼,則輸入正確密碼進入檔案,在命令模式裡輸入:set key= 這樣就沒有密碼了。還有一個更簡單的直接:X 一直按斷行符號就好了,也就是給空密碼。
可視模式
在普通模式下輸入v(小寫),進入字元選擇模式,就可以移動游標,游標走過的地方就會選取。再次按下v會後就會取消選取。
在普通模式下輸入Shift+v(小寫),進入行選擇模式,按下V之後就會把整行選取,您可以上下移動游標選更多的行,同樣,再按一次Shift+v就可以取消選取。
在普通模式下輸入 Ctrl+v(小寫),這是地區選取項目模式,可以進行矩形地區選取項目,再按一次Ctrl+v取消選取。
在普通模式下輸入d刪除選取地區內容
在普通模式下輸入y複製選取地區內容
Shell編程
變數相關
env是查看環境變數,而set是查看當前所有變數(包括使用者自訂的變數)。自訂變數中用的最多、看的最多的其實是SP1變數,我們可以用set查看一下,env是不能看到的,因為它不是環境變數。SP1變數儲存的就是使用者命令提示字元。
Locale命令是查看當前系統語系,主要看LANG和LC_ALL的變數。
LANG:定義系統主語系的變數
LC_ALL:定義整體語系變數
對於這兩個變數可以粗略的理解成LANG是當前的語系(臨時的),而LC_ALL是總體的語系,重啟後當前語系將恢複成LC_ALL的值。
$?,表示上一個命令執行的結果,0為真(正常執行),非零為假(執行失敗)。
$n,n是正整數,$0是代表命令本身,$1-$9分別代表參數1到參數9,例:./hello.shabc 11 22,./hello.sh是命令本身(執行一個hello.sh的指令碼)為$0,後面的abc是第一個參數$1,11和12分別是第二和第三個參數,即$2和$3。在實際的shell程式裡面,可以直接用$n的值。如果參數大於10個需要大括弧,如${10}。
$*,代表所有參數,把所有參數看為一個整體。如上面的例子裡面$*的值為abc 11 22。
$@,也代表所有參數,但和$*不同的是,在使用時是區別開的,即一個一個使用。
$#,代表的是參數個數。
例子:
#/bin/bash #this file is plus.sh Sum=(($1 + $2)) echo $Sum echo $* echo $@ echo $# |
執行這個指令碼:./plus.sh11 22
結果:
33
11 22
11 22
2
例2:
#!/bin/bash #this file is for.sh for i in "$*" do echo $i done for j in "$@" do echo $j done |
執行指令碼:./for.sh1 2 3 4
結果:
1 2 3 4
1
2
3
4
read命令(非常實用的命令):
參數:-p “提示資訊” ------在讀入一個值之前,輸出一些提示資訊
-t 秒數 -------指定等待使用者輸入的最大時限
-n 數字 -------指定讀入最大字元數
-s --------隱藏使用者輸入,類似使用者登入時輸入密碼的效果
測試語句
1、 按檔案類型進行判斷
-b 判斷檔案是否存在,並且是否為塊裝置檔案
-c 判斷檔案是否存在,並且是否為字元裝置檔案
-d 判斷檔案是否存在,並且是否為目錄檔案(是目錄檔案為真)
-e 判斷檔案是否存在(存在為真)
-f 判斷檔案是否存在,並且是否為普通檔案
-L 判斷檔案是否存在,並且是否為連結檔案
-p 判斷檔案是否存在,並且是否為管道檔案
-s 判斷檔案是否存在,並且是否為非空(是非空為真)
-S 判斷檔案是否存在,並且是否為通訊端檔案
2、 按照檔案許可權判斷
-r 判斷檔案是否存在,並且擁有讀許可權
-w 判斷檔案是否存在,並且擁有寫入權限
-x 判斷檔案是否存在,並且擁有執行許可權
-u 判斷檔案是否存在,並且擁有SUID許可權
-g 判斷檔案是否存在,並且擁有SGID許可權
-k 判斷檔案是否存在,並且擁有SBit許可權
3、 兩個檔案之間進行比較
檔案1 -nt 檔案2 判斷檔案1的修改時間是否比檔案2的新
檔案1 -ot 檔案2 判斷檔案1修改該時間是否比檔案2的舊
檔案1 -ef 檔案2 判斷檔案1是否和檔案2的inode號一致,可以理解為兩個檔案是否為同一個檔案。通常用於判斷永久連結。
4、 兩個整數之間比較
整數1 -eq 整數2 判斷兩數是否相等
整數1 -ne 整數2 判斷兩數是否不相等
整數1 -gt 整數2 判斷整數1是否大於整數2
整數1 -lt 整數2 判斷整數1是否小於整數2
整數1 -ge 整數2 判斷整數1是否大於等於整數2
整數1 -le 整數2 判斷整數1是否小於等於整數2
eq是equal的縮寫 ne是 not equal的縮寫 gt是great than的縮寫 lt是less than的縮寫 ge是great thanor equal to的縮寫 le是less than equal to的縮寫
5、 字串的判斷
-z 字串 判斷字串是否為空白
-n 字串 判斷字串是否為非空
字串1 == 字串2 判斷兩個字串是否相等
字串1 =! 字串2 判斷兩個字串是否不等
6、 多重條件判斷
判斷1 -a 判斷2 邏輯與,兩個都成立結果為真
判斷1 -o 判斷2 邏輯或,有一個為真,即結果為真
。判斷 邏輯非,將判斷結果取反
兩種判斷格式
l test -e /root/install.log
l [ -e /root/install.log ] 推薦使用這種
if語句
if [ 條件判斷式 ];then
條件成立執行的語句
else
不成立時執行的語句
fi
或者
if [ 條件判斷式 ]
then
條件成立時執行的語句
else
條件不成立時執行的語句
Fi
case語句
基本格式:
case $變數名 in
“值1”)
如果變數的值等於值1,則執行程式1
;;
“值2”)
如果變數的值等於值2,則執行程式2
;;
*)
如果變數的值都不是以上的值,則執行此程式碼
;;
esac
for語句
文法一、
for 變數 in值1 值2 值3…..
do
程式
done
文法二、
for(( 初始值;迴圈控制條件;變數變化 ))
do
程式
done
文法二類似c語言的for迴圈
while迴圈和until迴圈
while [ 條件判斷式 ]
do
程式
done
只要條件判斷式成立,就開始迴圈。
通常在程式碼裡,應該有可以退出迴圈的控制語句。
Until迴圈和while迴圈相反,只要條件判斷式不成立就開始迴圈。一旦迴圈條件成立時,則迴圈終止。
Linux下$()與${}、$(())詳解 一、關於$()
其實$()與``(反勾號)的作用相同,都是用來做命令替換用的,也就是用來重組命令列的。裡麵包含的必須是一個命令語句。
在實際使用中,command line裡面出現$(),會先執行$()裡面的命令語句。比如:
echo today is $(date)!我們知道date命令是列印當前的時間,那麼先執行date命令,在通過echo命令將整個句子結果列印到標準輸出,結果是:today is Sun Oct 1820:24:31 CST 2015!
當然整句命令可以替換成:echotoday is `date`!結果完全一樣。
$()與``比較
優點:$()可以很好的與’’(單引號)區別開來,實際使用直觀可讀性好。
缺點:可移植性沒有``好,``基本可用在其他所有shell中。
二、關於${}
先看例子:
先定義一個變數A=he,現在想要輸出hello,我們可以echo $Allo,這是你會發現輸出的是空,原因就是shell會把你的變數識別成$Allo而不是$A+llo,而$Allo是一個沒有賦值的變數,當然會輸出空。現在我們改一下echo ${A}llo,此時得到hello正確結果。顯然${}是變數的定界符,標明變數名的長度界限,增強可讀性。其實我們平常寫的$A只是${A}的簡寫形式,在shell script裡面,應盡量避免用簡寫形式,這樣可以大大減少出錯。
${}如果僅僅只是起到定界符的作用,那就太小看它了,以下是它的一些特殊並常用的用法樣本:
假設我們定義了一個變數為:
file=/dir1/dir2/dir3/my.file.txt
我們可以用 ${ } 分別替換獲得不同的值:
${file#*/}:拿掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最後一條 / 及其左邊的字串:my.file.txt
${file#*.}:拿掉第一個. 及其左邊的字串:file.txt
${file##*.}:拿掉最後一個. 及其左邊的字串:txt
${file%/*}:拿掉最後條 / 及其右邊的字串:/dir1/dir2/dir3
${file%%/*}:拿掉第一條 / 及其右邊的字串:(空值)
${file%.*}:拿掉最後一個. 及其右邊的字串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一個. 及其右邊的字串: