linux學習之shell編程基礎

linux學習之shell編程基礎

1 Vim文本編輯器

  1.1 vim命令

  用於打開或建立文檔,格式爲「vim [文件名]」。若是存在該文檔,則打開它;若不存在,則建立一個臨時輸入文檔。  html

  命令模式:控制光標移動,可對文本進行復制、粘貼、刪除和查找等工做,vim命令執行後默認先到命令模式。linux

  輸入模式:正常的文本錄入。正則表達式

  末行模式:保存或退出文檔,以及設置編輯環境。shell

  1.1.1 模式切換:

  命令模式==》輸入模式  a、i、o(其中a鍵是在光標後一位切換到輸入模式;i鍵是在光標當前位置切換到輸入模式;o鍵是在光標的下面建立一個空行切換到輸入模式)編程

  輸入模式==》命令模式  esc鍵vim

  命令模式==》末行模式  :鍵數組

  末行模式==》命令模式  esc鍵bash

  1.1.2 命令模式中經常使用命令

  dd  刪除(剪切)光標所在整行網絡

  5dd  刪除(剪切)從光標處開始的5行編程語言

  yy  複製光標所在整行

  5yy  複製從光標處開始的5行

  n  顯示搜索命令定位到的下一個字符串

  N  顯示搜索命令定位到的上一個字符串

  u  撤銷上一步操做

  p  將以前刪除(dd)或複製(yy)過的數據粘貼到光標後面

  1.1.3 末行模式可用命令

  :w  保存

  :q  退出

  :q!  強制退出(放棄對文檔的修改內容)

  :wq!  強制保存退出

  :set nu  顯示行號

  :set nonu  不顯示行號

  :命令  執行該命令

  :整數  跳轉到該行

  :s/one/two  將當前光標所在行的第一個one替換成two

  :s/one/two/g  將當前光標所在行的全部one替換成two

  :%s/one/two/g  將全文中的one替換成two

  ?字符串  在文本中從下至上搜索該字符串

  /字符串  在文本中從上至下搜索該字符串

1.2 配置主機名稱、網卡信息

  在Linux系統中一切皆是文件,所以配置網絡服務也就是編輯網卡配置文件。

  Linux系統中,主機名大多保存在/etc/hostname文件中,網卡信息保存在/etc/sysconfig/network-scripts/中,RHEL7中,網卡配置文件名爲ifcfg-eno16777728

  ifconfig命令

  用於查看網絡配置信息

  查看DNS:cat /etc/resolv.conf

  查看GATEWAY:netstat  -rn

  


命令行的#與$的區別:

  #爲管理員(root)登陸,切換到$: su - username(不忽略空格)

  $爲普通用戶登陸,切換到#:su - root (而後輸入root密碼)


 

  ping命令

  用於測試網絡可否聯通,自己不會中止,需Ctrl+C中止

  經常使用參數:

  -c  規定嘗試次數

  -i  定義每一個數據包的發送間隔

  -W  定義等待超時時間

 ping -c 3 -i 0.2 -W 3  

  重啓網卡:systemctl restart network

 1.3  配置Yum軟件倉庫

  Yum配置文件在/etc/yum.repos.d/,yum配置文件後綴名必須爲.repo

  yum install httpd -y    檢查軟件倉庫是否可用

  mount  /dev/cdrom   /media/cdrom    掛載

  Yum配置文件註解:  

  [rhel-media]  Yum軟件倉庫惟一標識符,避免與其餘倉庫衝突

  name=liunxprobe  Yum軟件倉庫的名稱描述,易於識別倉庫用處

  baseurl=file:///media/cdrom/  提供的方式包括:FTP(ftp://……)、HTTP(http://……)、本地(file:///……)

  enabled=1  設置此源是否可用;1爲可用,0爲禁用

  gpgcheck=1  設置此源是否校驗文件;1爲校驗,0爲不校驗

  gpgkey=file:///media/cdrom/RPM-GPG-KEY-redhat-release  若校驗開啓,需指定公鑰文件地址

 1 % cd /etc/yum.repos.d/

2 % vim rhel7.repo 

1 % mkdir -p /media/cdrom
2 % mount /dev/cdrom  /media/cdrom
3 % vim  /etc/fstab
4     #輸入/dev/cdrom  /media/cdrom  iso9660  defaults  0  0
5 % yum install httpd

 

  2 編寫shell腳本

  shell腳本命令工做方式:

  交互式(Interactive):用戶輸入一條命令就當即執行。

  批處理(Batch):由用戶事先編寫好一個完整的Shell腳本,Shell會一次性執行腳本中諸多命令。

  腳本文件名稱通常加上.sh後綴

  

1 % vim example.sh
2 #!/bin/bash    #腳本聲明,用來指定SHELL解釋器
3 #For Example BY liang    #註釋信息,用於介紹腳本功能和命令
4 pwd
5 ls -al

 

  2.1 執行腳本

  方式一:

 % bash example.sh 

  方式二:

 1 % chomd u+x example.sh   #增長執行權限

2 % ./example.sh   

  2.2 chomd命令

  用戶可使用chmod指令去變動文件與目錄的權限,設置方式採用文字或數字代號皆可。符號鏈接的權限沒法變動,若是用戶對符號鏈接修改權限,其改變會做用在被鏈接的原始文件。格式爲

chmod(選項)(參數)

  權限範圍的表示法以下:

  u User,即文件或目錄的擁有者;
  g Group,即文件或目錄的所屬羣組;
  o Other,除了文件或目錄擁有者或所屬羣組以外,其餘用戶皆屬於這個範圍;
  a All,即所有的用戶,包含擁有者,所屬羣組以及其餘用戶;

  r 讀取權限,數字代號爲「4」;
  w 寫入權限,數字代號爲「2」;
  x 執行或切換權限,數字代號爲「1」;
  - 不具任何權限,數字代號爲「0」;
  s 特殊功能說明:變動文件或目錄的權限。

  2.3 接收用戶參數

% ./example.sh one two three four five six

 

  $0  當前Shell腳本程序名稱

  $#  總共有幾個參數

  $*  全部位置的參數值

  $?  顯示上一次命令的執行返回值

  $N  第N個位置的參數值

  2.4 判斷用戶的參數

  Shell腳本中的條件測試語法能夠判斷表達式是否成立,若成立則返回0,不然返回其餘隨機數值(具體值因版本不一樣而不一樣,RHEL7爲1)

  條件表達式兩邊均要有一個空格

   % [ -d /etc/fstab ]

   % echo $?

   #輸出1 

  條件測試語句分爲4種:文件測試語句、邏輯測試語句、整數值比較語句、字符串比較語句

  2.4.1 文件測試語句

  經常使用參數:

  -d  測試文件是否爲目錄類型

  -e  測試文件是否存在

  -f   判斷是否爲通常文件

  -r  測試當前用戶是否有權限讀取

  -w   測試當前用戶是否有權限寫入

  -x  測試當前用戶是否有權限執行

   1 % [ -f /etc/fstab ]

   2 % echo $?

   3 #輸出0 

  2.4.2 邏輯測試語句

  與(&&)、或(||)、非(!)

  與(&&)  當前面的命令執行成功後纔會執行它後面的命令

   % [ -e /dev/cdrom ] && echo "Exist" 

  或(||)  當前面的命令執行失敗時纔會執行它後面的命令

   % [ $USER=root ] || echo "user" 

  非(!)  把條件測試中的判斷結果取反值。

   % [ ! $USER=root ] || echo "Administrator"  #判斷當前用戶是否爲管理員

  邏輯命令運用

   % [ ! $USER=root ] && echo "user" || echo "root" #判斷當前用戶是管理員仍是普通用戶  

  2.4.3 整數值比較語句

  運算符

  -eq  是否等於

  -ne  是否不等於

  -gt  是否大於

  -lt  是否小於

  -le  是否小於等於

  -ge  是否大於等於

  2.4.4 awk命令

  awk是一種編程語言,用於在linux/unix下對文本和數據進行處理。數據能夠來自標準輸入(stdin)、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大編程工具。它在命令行中使用,但更可能是做爲腳原本使用。awk有不少內建的功能,好比數組、函數等,這是它和C語言的相同之處,靈活性是awk最大的優點。

  詳解見https://www.cnblogs.com/quincyhu/p/5884390.html

   % FreeMem=`free -m | grep Mem: | awk 'print $4'` #輸出剩餘內存量,$4第四列

  判斷內存可用量的值是否小於1024,小於則提示內存不足

   % [ $FreeMem -lt 1024 ] && echo "Insufficient Memory" 

  2.4.5 字符串比較語句

  運算符

  =  比較字符串內容是否相同

  !=  比較字符串內容是否不一樣

  -z  判斷字符串內容是否爲空(某個變量是否未被定義)

   % [ $LANG != "en.US" ] && echo "Not en.US" 

  3 流程控制語句

  3.1 if條件測試語句

  單分支:  if   條件測試操做

          then  命令序列

        fi

1 % vim mkcdrom.sh
2 #!/bin/bash
3 DIR="/media/cdrom"
4 if  [ ! -e  $DIR  ]
5 then
6 mkdir -p $DIR
7 fi

 

  雙分支:  if  條件測試操做

          then  命令序列1

          else  命令序列2

        fi

1 % vim chkhost.sh
2 #!/bin/bash
3 ping  -c 3  -i 0.2  -W 3  $1  &>  /dev/null  #/dev/null爲linux系統的黑洞文件,若只要命令結果而不想向屏幕輸出可用此方式,保持屏幕清潔
4 if  [ $?  -eq  0 ]  #上一行命令執行成功返回0,不然返回1
5 then
6 echo "Host $1 is On-line."
7 else
8 echo "Host $1 is Off-line."
9 fi

 

  多分支:  if  條件測試操做1

          then  命令序列1

        elif  條件測試操做2(可加多個elif)

          then  命令序列2

        else  命令序列3

        fi

 1 % vim chkscore.sh
 2 #!/bin/bash
 3 read -p "Enter your score (0-100):" GRADE
 4 if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
 5 echo "$GRADE is Excellent"
 6 elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
 7 echo "$GRADE is Pass"
 8 elif [ $GRADE -le 69 ] : then
 9 echo "$GRADE is Fail" 
10 else
11 echo "Your score is illegal!"
12 fi

  read命令

  用來讀取用戶輸入信息,可以把接收到的用戶輸入信息賦值給後面的指定變量,-p參數用於向用戶顯示必定的提示信息。

  3.2 for條件循環語句

  for條件循環語句容許腳本一次性讀取多個信息,而後逐一對信息進行操做處理,當要處理的數據有範圍時,最適合用此語句。

    for  變量名  in  取值列表

    do

      命令序列

    done

  批量建立用戶腳本:

 1 % vim users.txt
 2 andy
 3 barry
 4 carl
 5 duke
 6 eric
 7 george
 8 
 9 %vim Example.sh
10 #!/bin/bash
11 read -p "Enter The Users Password: " PASSWD
12 for UNAME in `cat users.txt`
13 do
14 id $UNAME &> /dev/null
15 if [ $? -eq 0 ]
16 then
17 echo "Already exists"
18 else
19 useradd $UNAME &> /dev/null
20 echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
21 if [ $? -eq 0 ]
22 then
23 echo "$UNAME , Create success"
24 else
25 echo "$UNAME , Create failture"
26 fi
27 fi
28 done

 

  id命令

  用於查看用戶信息,執行成功說明用戶存在,格式「id [-gGnru][--help][--version][用戶名稱]」

  useradd命令

  用於建立新用戶,格式「useradd(選項)(參數)」

  passwd命令

  用於設置/修改用戶密碼,格式「passwd [options] [LOGIN]」

  3.3 while條件循環語句

  while語句經過判斷條件測試的真假來決定是否繼續執行命令。

    while  條件測試操做

    do

      命令序列

    done

  expr命令

  expr命令是一款表達式計算工具,使用它完成表達式的求值操做。格式「expr(選項)(參數)」

  經常使用運算符

  • 加法運算:+
  • 減法運算:-
  • 乘法運算:\*
  • 除法運算:/
  • 求摸(取餘)運算:%

  exit命令

  exit命令同於退出shell,並返回給定值。在shell腳本中能夠終止當前腳本執行。執行exit可以使shell以指定的狀態值退出。若不設置狀態值參數,則shell以預設值退出。狀態值0表明執行成功,其餘值表明執行失敗。格式「exit(參數)」

  let命令

  let命令是bash中用於計算的工具,提供經常使用運算符還提供了方冪**運算符。在變量的房屋計算中不須要加上$來表示變量,若是表達式的值是非0,那麼返回的狀態值是0;不然,返回的狀態值是1。格式爲「let arg [arg ...] #arg表明運算式」

    自加操做let no++
    自減操做let no--
    簡寫形式let no+=10let no-=20,分別等同於let no=no+10,let no=no-20

例:猜商品價格

 1 % vim Guess.sh
 2 #!/bin/bash
 3 PRICE=$(expr $RANDOM % 1000)
 4 TIMES=0
 5 echo "商品實際價格爲0-999之間,猜猜看是多少?"
 6 while true
 7 do
 8 read -p 「請輸入您猜想的價格:」 INT
 9 let TIMES++
10 if [ $INT -eq $PRICE] ; then
11 echo "恭喜您答對了,實際價格是$PRICE"
12 echo "您總共猜了$TIMES次"
13 exit 0
14 elif [ $INT -gt $PRICE ] ; then
15 echo "過高了"
16 else
17 echo 「過低了」
18 fi
19 done

 

   3.4 case條件測試語句

  case語句是在多個範圍內匹配數據,若匹配成功則執行相關命令並結束整個條件測試;若是數據不在所列出的範圍內,則會去執行星號(*)中所定義的默認命令。

    case  變量值 in  

    模式1)

      命令序列1

      ;;

    模式2)

      命令序列2

      ;;

      ……

    *)

      默認命令序列

    esac  

 1 % vim Checkkeys.sh
 2 #!/bin/bash
 3 read -p "請輸入一個字符,並按Enter確認:" KEY
 4 case 「$KEY」 in
 5 [a-z]|[A-Z])
 6 echo "您輸入的是字母。"
 7 ;;
 8 [0-9])
 9 echo "您輸入的是數字。"
10 ;;
11 *)
12 echo "您輸入的是空格、功能鍵或其餘控制字符。"
13 esac

 

  4  計劃任務服務程序

  計劃任務分爲一次性計劃任務與長期性計劃任務。

  4.1  一次性計劃任務

  at命令

  實現一次性計劃任務,格式「at [時間]」,參數-l用於查看任務

  atrm命令

  刪除一次性計劃任務,格式「atrm [任務序號]」

 % echo "systemctl restart httpd" | at 23:30 #時間只能到分

  4.2 長期性計劃任務

  crond服務

  crontab  -e  建立/編輯計劃任務

  crontab -l   查看當前計劃任務

  crontab -r  刪除某條計劃任務

  crontab -u (需root權限)編輯他人的計劃任務

  參數設置順序:分、時、日、月、星期  命令,若是有些字段沒有設置需用星號(*)佔位。計劃任務也可加註釋信息,計劃任務中的「分」字段必須有數值,絕對不能爲空或者是星號(*),而「日」和「星期」字段不能同時使用,不然就會發生衝突。

  例:周1、3、五凌晨3點25,把網站數據進行備份

   % crontab -e

  25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot 

  除了用逗號(,)分別表示多個時間段,還可用減號(-)來表示一段連續的時間週期,以及用除號(/)表示執行任務的時間間隔(*/2表示每2分鐘執行一次任務),若是在crond服務中須要同時包含多條計劃任務的命令語句,應每行僅寫一條。在crond服務的計劃任務參數中,全部命令必定要用絕對路徑的方式來寫

  whereis命令

  用於查詢命令的絕對路徑。

相關文章
相關標籤/搜索