天天看點

4、檔案測試、字元測試、if、vim 學習筆記

bash程式設計之:字元測試,一般加引号                        

   雙目:

     > : 大于

     < :小于

     ==:等于,等值比較

     =~:左側是字元串,右側是一個模式,判斷左側的字元串能否被右側的模式所比對:通常隻在[[]]中使用

         模式中可以使用行首、行尾錨定符,但是模式不要加引号

     !=, <>: 不等于

   單目:

     -n 字元串: 字元串是否不空,不空為真,空則為假

     -z 字元串:字元串是否為空,空則為真,不空則假:

判定所有使用者是否擁有可登入shell

#!/bin/bash

for userName in `cut -d: -f1 /etc/passwd`; do

if [[ `grep "^$userName\>" /etc/passwd | cut -d: -f7` =~ sh$ ]]; then

echo "login user: $userName"

else

echo "nologin user: $userName"

fi

done

練習:寫一個腳本

1、讓使用者互動式輸入一個使用者名,先判定使用者是否存在;不存在,則以7為退出碼;

2、判斷使用者的shell是否為/bin/bash;如果是,則顯示為“Bash User.”,退出碼為0; 否則,則顯示為“Not Bash User.”,退出碼為1;

#

read -p "Enter a user name: " userName

if ! id $userName &> /dev/null; then

  echo "No such user."

  exit 7

fi      

userShell=`grep "^$userName\>" /etc/passwd | cut -d: -f7`

if [[ "$userShell" == "/bin/bash" ]]; then

  echo "bash user."

  returnValue=0

  echo "Not bash user."

  returnValue=1

exit $returnValue

1、顯示如下菜單:

cpu) show cpu info;

mem) show memory info;

quit) quit

Enter your option: CPU Cpu, CpU

2、如果使用者選擇cpu,則顯示檔案/proc/cpuinfo的資訊;

3、如果使用者選擇mem,則顯示檔案/proc/meminfo的資訊;

4、如果使用者選擇quit,則退出,且退出碼為5;

5、如果使用者鍵入其它字元,則顯示未知選項,請重新執行腳本;退出碼為6;

returnValue=0

cat << EOF

cpu) print cpu infomation

mem) print meory infomation

quit) Quit

EOF

read -p "Enter your option: " userOption

userOption=`echo $userOption | tr 'A-Z' 'a-z'`

if [[ "$userOption" == "cpu" ]]; then

  cat /proc/cpuinfo

elif [[ "$userOption" == "mem" ]]; then

  cat /proc/meminfo

elif [[ "$userOption" == "quit" ]]; then

  echo "quit"

  returnValue=6

  echo "unkown option"

  returnValue=7

vi編輯器

vim: vi improved

vi的模式:

編輯模式:鍵盤操作通常被解析為編輯指令;

輸入模式:文本輸入;

末行模式:vim的内置的指令行接口,執行vim内置指令

編輯模式-->輸入模式

i 在目前光标所在處輸入;

I 在目前光标所在行的行首輸入;

a 在目前光标所在處後面輸入;

A 在目前光标所在行的行尾輸入;

o 在光标所在行的下方新增一個空白行輸入;

O 在光标所在行的上方新增一個空白行輸入;              

輸入模式-->編輯模式:

ESC

編輯模式-->末行模式:

:

末行模式-->編輯模式:

ESC, ESC

vim指令的使用格式:

vim [options] file...

+[#]: 打開檔案後直接讓光标處于第#行的行首;

vim +8 /etc/fstab 将定位到/etc/fastab第八行的行首

退出

:q! 不儲存并退出

:wq 儲存并退出

:x 儲存并退出

編輯模式:ZZ, 儲存退出

打開:vim file1 file2 ...

:next 跳轉到下一個檔案

:prev 跳轉到上一個檔案

:first         跳轉到第一個檔案

:last 跳轉到最後一個檔案

:qall 全部檔案不儲存退出

:wqall         全部檔案儲存退出

分割視窗打開多個檔案: vim -o|O file1 file2 ...

-o 水準分割 先按Ctrl+w再按上下箭頭鍵,可以在各檔案間來回切換

-O 垂直分割 先按Ctrl+w再按左右箭頭鍵,可以在各檔案間來回切換

光标移動:

行間移動:

1G 第一行

G 最後一行

行内移動:

0 絕對行首

^ 第一個非空白字元

$ 絕對行尾

單詞間移動:

w 下個單詞的詞首

e 目前或下一個詞的詞尾

b 目前或前一個詞的詞首  

單字元移到:

h 左

l 右

j 下

k 上

句子間移動:

)

(

段落間移動:

}

{

編輯操作:

x 删除光标所在處的字元

#x 删除光标所在處開始向後的#個字元;

r 替換光标所在處的字元

d 删除指令,可以結合各光标跳轉指令使用

dd 删除一行

#dd 删除光标所在行其後面的行,共#行

c 删除指令,可以結合各光标跳轉指令使用                           

cc 删除光标所在行,并進入輸入模式                     

#cc 删除光标所在行開始的行,總共#行,并進入輸入模式                    

y 複制,可以結合各光标跳轉指令使用                   

yy 複制光标所在行                             

#yy 複制光标所在行其後面的行,共#行                            

p 粘貼                 

複制或删除的是整行           

p 粘貼在光标所在行的下方  

P 粘貼在光标所在行的上方   

複制或删除的為非整行         

p 粘貼在光标所在字元的後面

P 粘貼在光标所在字元的前面

u 撤消編輯                     

        Ctrl+r                          撤消此前的撤消                 

        .                               重複執行此前的指令                 

末行模式:範圍定界

10,19 第10行到第19行

10,+9 第10行開始的後9行

. 表目前行

$ 最後一行

.,$-2 目前行到倒數第三行

%  全部文本

/pat1/,/pat2/ 從光标所在行開始,第一次被pat1比對和第一次被pat2比對到之間的所有行

翻屏:

Ctrl+f 向檔案尾部翻一屏

Ctrl+b 向檔案首部翻一屏

Ctrl+d 向檔案尾部翻半屏

Ctrl+u 向檔案首部翻半屏

Enter 向檔案首部上移一行      k 向檔案尾部下移一行

查找:

/keyword

?keyword

n:

N:

支援正規表達式

  :set nohlsearch 關閉高亮顯示,對目前shell有效  

vim可視化模式:

v 按光标走過的區域選擇

V 選擇矩形塊,按光标走過的行選擇

分割目前視窗:

Ctrl+w, s 水準分割目前視窗

Ctrl+w, v 垂直分割目前序列槽

視窗屬性的定義:

:set nu 顯示行号

:set nonu 取消顯示行号

:set ai 設定自動縮進

:set noai 取消自動縮進

:set ic 忽略大小寫

:set noic 區分大小寫

:set sm  顯示對應的括号

:set nosm 不顯示對應的括号

:syntax on 開啟文法高亮

:syntax off 關閉文法高亮

:set hlsearch 開啟搜尋高亮

:set nohlsearch 關閉搜尋高亮

vim的配置檔案:

全局:/etc/vimrc

個人:~/.vimrc

查找替換:

:位址定界s/查找模式/替換為的内容/gi                        

g: global 全局替換

i: ignore-case 忽略大小寫

:位址定界s@查找模式@替換為的内容@gi

&: 用于在替換為的内容部分中引用前面比對到的所有内容;

練習:

1、複制/etc/grub.conf至/tmp目錄,删除/tmp/grub.conf檔案中行首的空白符;

%s@^[[:space:]]\{1,\}@@g

2、複制/etc/rc.d/rc.sysinit至/tmp目錄,将/tmp/rc.sysinit檔案中的以至少一個空白字元開頭的行,行首加#号

:%s@^[[:space:]]\{1,\}.*@#&@

3、删除/tmp/rc.sysinit檔案中以#開頭且後面跟了至少一個空白字元的行的行首的#号和空白符;

:%s@^#[[:space:]]\{1,\}@@g

4、為/tmp/grub.conf檔案中前三行的行首加#号; 

1,3s@^@#@g

5、将/etc/yum.repos.d/CentOS-Media.repo中enable=0一行最後的0改為1;

%s@\(enabled=\)[0-9]@\11@g

bash知識點:檔案測試

單目測試:

-e file 測試檔案是否存在

-s file 測試檔案是否存在并且不空

-f file 測試是否為普通檔案

-d file 測試是否為目錄檔案

-b file 測試是否為塊裝置檔案

-c file                         測試是否為字元裝置檔案

-h|-L file 測試是否為符号連結檔案

-p file                         測試是否為管道檔案  

-S file                         測試是否為套接字檔案 

-r file 測試其有效使用者是否對此檔案有讀權限

-w file 測試其有效使用者是否對此檔案有寫權限

-x file 測試其有效使用者是否對此檔案有執行權限

雙目測試:

file1 -nt file2         測試file1是否為file2更 新一些

寫一個腳本,完成如下任務:

1、分别複制/var/log下的檔案至/tmp/logs/目錄中;

2、複制目錄時,才使用cp -r

3、複制檔案時,使用cp

4、複制連結檔案,使用cp -d

5、餘下的類型,使用cp -a

targetDir='/tmp/logs'

[ -e $targetDir ] || mkdir $targetDir

for fileName in /var/log/*; do

  if [ -d $fileName ]; then

    copyCommand='cp -r'

  elif [ -f $fileName ]; then

    copyCommand='cp'

  elif [ -h $fileName ]; then

    copyCommand='cp -d'

  else

    copyCommand='cp -a'

  fi  

  $copyCommand $fileName $targetDir

寫一個腳本,完成如下任務,其使用形式如下所示:

script.sh {start|stop|restart|status}

其中:

如果參數為空,則顯示幫助資訊,并退出腳本;

如果參數為start,則建立空檔案/var/lock/subsys/script,并顯示“starting script successfully.”

如果參數為stop,則删除檔案/var/lock/subsys/script,并顯示“Stop script successfully.”

如果參數為restart,則删除檔案/var/locksubsys/script并重新建立,而後顯示“Restarting script successfully.”

如果參數為status,那麼:

如果檔案/var/lock/subsys/script存在,則顯示“Script is running...”,否則,則顯示“Script is stopped.”

bash的知識點:位置參數輪替(shift)

declare -i sum=0

for i in `seq 1 $#`; do

  let sum+=$1

  shift

echo $sum

寫一個腳本:使用形式如下

userinfo.sh -u username [-v {1|2}]

-u選項用于指定使用者;而後腳本顯示使用者的UID和GID;

如果同時使用了-v選項:

-v後面的值如果是1, 則額外顯示使用者的家目錄路徑;

-v後面的值如果是2, 則額外顯示使用者的家目錄路徑和shell;

[ $# -lt 2 ] && echo "Too less argements, quit" && exit 3

if [[ "$1" == "-u" ]];then

  userName="$2"

  shift 2

if [ $# -ge 2 ] && [ "$1" == "-v" ]; then

  verFlag=$2

verFlag=${verFlag:-0}

if [ -n $verFlag ];then

  if ! [[ $verFlag =~ [012] ]];then

    echo "Wrong parameter."

    echo "Usage: `basename $0` -u UserName -v {1|2}"

    exit 4

# echo $userName $verFlag

if [ $verFlag -eq 1 ]; then

  grep "^$userName" /etc/passwd | cut -d: -f1,3,4,6

elif [ $verFlag -eq 2 ];then 

  grep "^$userName" /etc/passwd | cut -d: -f1,3,4,6,7

  grep "^$userName" /etc/passwd | cut -d: -f1,3,4

      本文轉自開源殿堂 51CTO部落格,原文連結:http://blog.51cto.com/kaiyuandiantang/1939647,如需轉載請自行聯系原作者

繼續閱讀