Linux學習命令彙總四——Bash中變量.文件通配符.管道與重定向.算術運算及循環或判斷語句

本章Blog相關Linux知識點linux


編程語言,是用來定義計算機程序的形式語言。它是一種被標準化的交流技巧,用來向計算機發出指令。git

    強類型語言(靜態類型語言)是指須要進行變量/對象類型聲明的語言,通常狀況下須要編譯執行。例如C/C++/Java/C#
正則表達式

    弱類型語言(動態類型語言)是指不須要進行變量/對象類型聲明的語言,通常狀況下不須要編譯(但也有編譯型的)。例如PHP/Python/Perl/SQL/Shell等。shell

程序執行邏輯,bash腳本,面向對象的過程當中,編程

    順序執行:默認法則,逐條執行各語句;bash

    選擇執行:分支,條件判斷,符合條件的分支予以執行編程語言

    循環執行:將統一段代碼反覆執行有限次,故循環必須有退出條件,不然將陷入死循環。ide

程序代碼——控制語句和表達式組成函數

    bash循環控制語句 for ,until ,while
測試

    bash判斷控制語句 if , case

列表生成方法:for ,經過使用一個變量去遍歷給定列表中的元素,在每次變量賦值時執行一次循環體,直至賦值完成全部元素退出循環。

    直接給出列表   如:for I in /etc/passwd /etc/issue /etc/redhat-release; do

    使用文件名通配的機制生成列表   for I in /var/log/* ;do

    可使用{start..end}、`seq [start] [step] [end]` 生成數字序列  例: `seq 1 $lineCount`   或    `seq 1 2 100`

    使用命令生成  ,for userName in `cut -d: -f1 /etc/passwd` ;do

注:若命令用做條件,需引用命令狀態結果(即執行成功與否),而非命令的輸出結果,所以無需作命令引用 ;反之,若需命令結果 ,須要作命令引用


Linux  bash 特性一:命令展開


 ~ :指定用戶的家目錄

{Value1,Value2} :展開爲多個條目

例:# mkdir -p  /x/{a/{m,n},b}    在/x 目錄下建立目錄/x/a , /x/b , /x/a/m , /x/a/n 目錄

例:# mkdir -pv /tmp/mylinux/{usr/local/{bin,sbin},etc/{sysconfig,init.d},bin,sbin}         經過mkdir命令建立/tmp/mylinux/usr/local/bin , /tmp/mylinux/usr/local/sbin , /tmp/mylinux/etc/sysconfig , /tmp/mylinux/etc/init.d , /tmp/mylinux/bin ,/tmp/mylinux/sbin目錄


Linux bash 特性二 :符號引用


符號的做用:

    `` (反引號,tab 上面的鍵):命令引用,引用命令的執行結果 。命令引用的另一種符號 $( 命令)

    '' (單引號):強引用 ,變量替換不會進行 。被單引號用括住的內容,將被視爲單一字串。即便引號內的存在表明變量的$符號,僅做$符號使用。

    ""(雙引號):弱引用 ,可以執行變量替換。它防止通配符擴展,但容許變量擴展 。

例:# mkdir  `date +%Y-%m-%d-%H-%M-%S`     命令引用,建立以當前日期爲文件名的 文件

例:# wishdir=itwish   echo '$wishdir'     得出結果$wishdir   單引號,結果爲字符串

例:# wishdir=itwish   echo "$wishdir"     得出結果itwish   雙引號,結果爲變量替換

命令歷史:bash保存的過去曾執行的命令列表

當前shell進程的命令歷史保存在緩衝區;緩衝區的命令會在shell進程退出時,保存至文件.bash_history 中 ;使用上下箭頭按鍵可翻看此前曾執行的命令

# history  命令歷史

    -c :清空history 列表

    -d n :清空歷史中指定的第n行命令

    -a :追加回話的命令至歷史文件中

history 快捷方式:

    !n:執行命令歷史中第n行命令

    !! :執行上一次命令

    !-n :執行命令歷史中倒數第n行命令

    !string :執行命令歷史中最近一次以string 開頭的命令

    !$ :引用上一條命令的最後一個參數 ,(Esc鍵 + . )

命令歷史中相關的環境變量:

    HISTSIZE :命令歷史中能夠保存的命令個數

    HISTFILE :命令歷史保存文件

    HISTFILESIZE :命令歷史保存文件中能夠保存命令的個數

    HISTCONTROL :控制命令歷史的生成 (ignoredups表明忽略記錄重複的命令;ignorespace表明以空格開頭的命令不記錄;ignoreboth 表明同時具有以上兩種特性)


Linu bash 特性三:bash 中的變量


變量類型:

    本地變量,只對當前Shell進程有效,對其子shell 及其餘shell都無效

  • 定義變量:# [set] Var_Name="Value"    注:在定義變量時,=左右不能有空格

  • 引用變量:${Var_Name} 或 $Var_Name

  • 撤銷變量: # unset Var_name

    局部變量,進隊進程中的某一個函數片斷有效,僅對局部代碼有效

  • 定義變量: # local Var_Name="Value"   注:在定義變量時,=左右不能有空格

    環境變量,用來描述bash的工做特性,用於保存當前會話的屬性信息。對當前Shell進程及其子shell進程都有效

  • 定義變量;# export  Var_Name="Value"   注:在定義變量時,=左右不能有空格

    位置變量,$1 ... $n 分別表明不一樣的參數

    特殊變量

  • $0:腳本名稱自身

  • $?:上一次命令的執行狀態。狀態使用數字表示,0表示執行成功,1-255表示執行失敗

  • $*,$@ : 引用全部的位置參數

顯示環境變量: # export   ,# env  ,# printenv  ,# set  (顯示當前進程中的全部變量,包括本地變量及環境變量)

輸出變量:# echo $變量 或 # echo ${變量名}

例:# NAME="itwish" echo ${NAME}  ,得出結果itwish  

read 交互式腳本  ,命令格式

    -t :超時時間

    -p :提示

    -n :變量數量

例: # read -t 5 -p 「Enter a num: " Num    ,輸入一個數字,保存到變量Num中,超時時間爲5s

給予變量以默認值:

VarName=${VarName,-n} ,若是VarName不空 ,則其值不變 ;不然,VarName 會使用n做爲其值

例:#!/bin/bash

       read -t 5 -p "Enter a num:" num1

       num1=$ {num1:-0}

       echo $num1

bash中的配置文件,用來保存配置信息

    profile類文件:爲交互式登陸的用戶提供配置信息;功能:設定環境變量,如運行命令或腳本

    /etc/profile    全局配置

    /etc/profile.d/*.sh 全局配置

    ~/.bash_profile  我的配置,僅對該目錄用戶有效

    bashrc 類文件:爲非交互式登陸的用戶提供配置;功能:設定本地變量 ,如設置命令別名

    /etc/bashrc 全局配置

    ~/.bashrc   我的配置

用戶登陸類型:

    交互式登陸:直接經過終端輸入用戶信息登陸,如# su  - UserName 或 # su -l UserName;讀取配置文件的順序爲:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

    非交互式登陸:如 # su UserName ;讀取配置文件順序爲 :~/.bashrc --> /etc/bashrc ---> /etc/profile.d/*.sh

使新增配置的生效方式:

    通知sehll 重讀配置文件的命令 # source (.) FILE

    從新登陸


Linu Bash 特性四:命令別名及文件通配符globbing


alias 定義別名,命令格式:

# alias [-p] [name[=value] ...] 

# alias :顯示當前shell中定義的全部別名

# unalias :取消定義別名 

# \command :在命令前加反斜線,代表使用命令自己

例:# alias cdnet='cd /etc/sysconfig'   定義cdnet 命令表明了cd /etc/sysconfig 功能

文件通配符的做用是爲了匹配相關文件,與以前blog說起的正則表達式(功能:匹配文件中的字符串)相區分 。

    * :表明任意長度的任意字符 ,而正則表達式中*的含義爲匹配前面的字符任意次

    ? :表明任意單個字符 ,與正則表達式中.的含義相同。

    [ ] :匹配範圍內的任意字符   ,例:[Ss] 表明匹配S或s內的任意單個字符

    [0-9] 或 [[:digit:]] :任意單個0-9的數字

    [a-z] 或 [[:lower:]] :任意單個a-z 小寫字母

    [A-Z]或[[:upper:]] :任意單個A-Z大寫字母

    [[:alpha:]] :任意單個大小寫字母

    [[:alnum:]] :任意單個帶大小寫字母或數字

    [[:space:]] :任意單個空白符

    [[:punct:]] :任意單個特殊字符

    [^] :指定範圍外的任意單個字符

例:# cp -r   /var/1*[0-9]*[:lower:] /tmp    ,複製/var/ 目錄下全部以1開頭,以一個小寫字母結尾,且中間出現一位數字的文件或目錄至/tmp 下

例:# cp -r /var/[^[:alpha:]][[:alnum:]]?  /tmp/,複製/var目錄下以非字母開頭,後面跟了一個字母或數字,且最後跟單個字符的文件或目錄至 /tmp下

Linu Bash 特性五:bash 快捷鍵及命令補全


Ctrl + l :清屏,至關於clear

Ctrl + a:光標跳至命令首部

Ctrl + e:光標跳至命令結尾

Ctrl + c:取消或終止命令執行

Ctrl + u:刪除命令行首至光標所在處的全部內容

Ctrl + k:刪除光標所在位置至命令行尾的全部內容

Ctrl + z:將當前的命令放置後臺執行

命令補全功能:

    PATH :是一組由分號分開的路徑,使用TAB按鍵進行補全

路徑補全

    在給出的打頭路徑下補全;若是沒有則爲當前。使用TAB按鍵進行補全


Linu Bash 特性六:管道與重定向


管道機制

    | : 一條命令的輸出結果做爲另外一條命令的輸入

重定向

輸入重定向 < , <<

    < : 輸入重定向

    << EOF :此處建立文件,經常使用語在腳本中建立文件或生成菜單

    例:#!/bin/bash

            cat << EOF

            a) :show user info

            b) :show disk info

            c):show cpu info

            EOF

輸出重定向 > , >>

    > : 覆蓋輸出

    >> :追加輸出,# set -c :禁止使用覆蓋重定向至已經存在的文件 ,# set +c :關閉上述特性

    >> /dev/null :位桶 , 通常用於命令結果覆蓋輸出 ,例  # ls /etc/ >> /dev/null  echo $?

錯誤重定向 2> , 2 >>

    2> :錯誤覆蓋輸出

    2>>:錯誤追加輸出

同時重定向標準輸出及錯誤輸出

    Command &> /path :表明成功輸出和錯誤輸出到同一制定文件/path


Linu Bash 特性七:算數運算


declare  定義變量

    -i  :定義×××變量

    -x :定義環境變量,相似於 #export

例:# declare -i sum=0 ,定義sum變量爲×××變量,且值爲0

操做符:

    + ,- ,* ,/ , %

    += ,-= ,*= ,/= , %=

    ++ ,--  例: let sum ++ , let I--

運算格式:

 let VarNum=$num1+$num2  或 let VarNum=$num1+`命令`

 VarNum=$[$num1+$num2]

 VarNum=$(($num1+$num2))

 VarNum=`expr $num1 + $num2`


Linu Bash特性八:條件判斷


斷定後續操做的前提條件是否知足,條件判斷經常使用判斷類型:

bash條件判斷:

    test EXPRESSION

    [  EXPRESSION ]  ,兩端有空白

    [[ EXPRESSION ]] ,兩端有空白

整數測試:

    num1 OPRAND num2

    -gt:大於 [ $num1 -gt $num2 ]

    -lt :小於

    -ge:大於或等於

    -le:小於或等於

    -ne:不等於

    -eq:等於

字符測試:

    > :大於

    < :小於

    == :等值比較 ,變量加雙引號,且注意空白符。例: [ "$StringA"  == "$stringB"  ]

    =~ :左側是字符串(或變量),右側是一個模式 。斷定左側的字符串可否被右側的模式所匹配 ;一般只在[[  ]] 中使用模式中可使用行首、行尾錨定符 ,但模式不要加引號 

    -n  $stringVar :斷定字符串是否不空 ,不空爲真 ,空則爲假  例:[ -n "$stringA"]  ,判斷stringA是否爲不空 ,不空爲真

    -z  $stringVar :斷定字符串是否爲空 ,空爲真  ,不空爲假   例:[ -z "$stringA"]  ,判斷stringA是否爲空 ,空爲真

例:[[ "$stringA" =~ ot ]] ,判斷stringA 字符串是否包含ot ,包含爲真

例:[[ `grep "^$userName\>" /etc/passwd |cut -d: -f7` =~ sh$ ]]    判斷變量userName 中的shell 是否以sh結尾                

文件測試:

    -e  File :測試文件是否存在

    -a  File:測試文件是否存在

    -f   File :測試是否爲普通文件

    -d  File :測試是否爲目錄文件

    -b  File :測試文件是否存在而且爲塊設備

    -c   File :測試文件是否存在而且爲字符設備

    -r   File : 測試其有效用戶是否對此文件有讀權限

    -w  File:測試文件是否存在 且測試其有效用戶是否對此文件有寫權限  

    -x   File :  測試文件是否存在 且測試其有效用戶是否對此文件有執行權限

    -s   File:測試文件是否存在而且不空   

例: [ -e  $fileName ] || mkdir $fileName    若文件不存在,則建立目錄

組合條件測試:

    與: && ,條件1 && 條件2  ,即若是條件1知足,執行條件2

      條件1位假,則最終結果必定爲假,所以條件2將不執行

      條件1位真,則最終結果取決於後面的條件,條件2必須執行。

    或: || ,有真爲真 ,若是條件1不知足,則執行條件2

       條件1位真,則最終結果必定爲真,所以條件2將不執行

       條件1位假,則最終結果取決於後面的條件,條件2必須執行。

    非: ! , 非真爲假,非假爲真

例: # id $userName &> /dev/null && echo "$userName exit ." || echo "$userName is not exit"    若是$userName 用戶存在,則輸出「exit」,不然輸出‘not exit’


Linu Bash 編程練習1


一、 寫一個腳本,計算100之內全部整數的和

#!/bin/bash
declare -i sum=0
for I in {1..100};do
   let sum+=$I
   let I++
done
echo "1 to 100 sum is $sum"

二、寫一個腳本,計算100之內全部奇數的和 及全部偶數的和
方法1:

#!/bin/bash
declare -i sum1=0
declare -i sum2=0
for I in `seq 1 2 100`;do
   let sum1+=$I
   let I+=2
done
echo "1 to 100 jishu sum is $sum1"
for I in `seq 0 2 100`;do    表示從0開始,以2 爲跨度,直至100
    let sum2+=$I
    let I+=2
done
echo "1 to 100 oushu sum is $sum2"

方法2:

#!/bin/bash
declare -i sum1=0
declare -i sum2=0
for I in {1..100};do
    if [ $[$I%2] -eq 0 ];then   經過取模是否爲0判斷是奇數仍是偶數,注意$[$I%2]
       let sum1+=$I
    else
       let sum2+=$I
    fi
done
echo "the O sum is $sum1"
echo "the sum is $sum2"

三、計算全部計算機內用戶的ID之和
方法1:

#!/bin/bash
declare idsum=0
NO=`wc -l /etc/passwd |cut -d' ' -f1`
for I in `seq 1 $NO`;do
   J=`cut -d: -f3 /etc/passwd |head -$I |tail -1`
   idsum=$[$idsum+$J]
done
echo "id sum is $idsum"

方法2:

#!/bin/bash
declare idsum=0
for I in `cut -d: -f3 /etc/passwd`;do       列表循環
    idsum=$[$idsum+$I]
done
echo "id sum is $idsum"

 
四、計算/etc/rc.d/rc.sysinit、 /etc/init.d/functions 和 /etc/issue 三個文件的字符數之和

#!/bin/bash
declare -i charSum=0
for fileName in {/etc/rc.d/rc.sysinit,/etc/init.d/functions,/etc/issue};do
     let J=`wc -c $fileName |cut -d' ' -f1`
     charSum=$[$charSum+$J]  或 let charSum=$charSum+`wc -c $fileName |cut -d' ' -f1`
done
echo "The CharSum is $charSum"

五、新建用戶tmpuser1~tmpuser10 ,並計算他們的id之和

#!/bin/bash
declare -i idSum=0
for I in {1..10};do
  useradd tmpuser$I;
  let J=`id -u tmpuser$I`
  idSum=$[$idSum+$J]   或 let idSum=$idSum+`id -u tmpuser$I`
done
echo "The User idSum is $idSum"

六、判斷文件中是否有空白行

#!/bin/bash
Read -p "Enter a File Path: "fileName
if  grep "^$"  $fileName &>/dev/null ; then
       lineCount=`grep "^$" $fileName` |wc -l
       echo "$fileName have $lineCount space lines"
fi

七、判斷兩個數隨大隨小

#!/bin/bash
if [ $# -lt 2 ] ;then       #表示腳本參數不能少於2個,中括號內格式須要兩端留空格
     echo "Usage : j.sh num1  num2"
     exit 7
fi
if [ $1 -gt $2 ];then
    echo "the max num is $1"
else
     echo "the max num is $2"
fi


Linu Bash 編程練習2


一、寫一個腳本實現如下功能
 讓用戶經過鍵盤輸入一個用戶名;若是用戶存在,就顯示其用戶名和UID;不然就顯示用戶不存在 ‘

#!/bin/bash
read -t 5 -p "Input a userName:" userName
userName=${userName:-root}    設定爲默認值
if id $userName &> /dev/null;then
   echo "$userName name is $userName ;UID is `id -u $userName`"
else
   echo "$userName is not exit."
fi

 
二、讓用戶經過鍵盤輸入一個用戶名,若是用戶不存在就退出;若是用戶的UID大於或等於500,就顯示它是普通用戶,不然就說明這是管理員或系統用戶

#!/bin/bash
read -p "Input a userName:" userName
id $userName &>/dev/null
if [ `echo $?` -ne 0 ];then     或者  if ! id $userName &> /dev/null ;then   判斷用戶不存在
   echo "$userName is not exits"
   exit 100
else
   if [ `id -u $userName` -ge 500 ];then
       echo "$userName is useradmin"
   else
       echo "$userName is rootadmin"
   fi
fi

三、讓用戶經過鍵盤輸入一個用戶名,若是用戶不存在就退出,若是其UID等於其GID,就所它是一個「good guy」 ,不然就是「bad guy」

#!/bin/bash
read -p "Input a userName:" userName
id $userName &>/dev/null
if [ `echo $?` -ne 0 ];then                       #判斷用戶是否爲不存在
   echo "$userName is not exits"
   exit 100
else
   if [ `id -u $userName` -eq `id -g $userName` ];then
      echo "$userName is good guy"
   else
       echo "$userName is bad guy"
   fi
fi

四、寫一個腳本 ,添加10個用戶stu1 -stu10 ,但要先判斷用戶是否存在 ,若是存在,就用紅色顯示其已存在 ;不然就添加此用戶 ,最後顯示一共添加了幾個用戶

#!/bin/bash
#
declare -i sum=0
for I in {1..10};do
 if id stu$I &>/dev/null;then    #用戶存在爲真
    echo -e "\033[31mstu$I is exits.\033[0m"
 else
    useradd stu$I && echo "\033[32mstu$I \033[0m add sucessful."
    let sum++
 fi
done
echo "useradd $sum users"

五、斷定有用戶是否擁有可登錄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

 
六、讓用戶交互式輸入一個用戶名,先判斷用戶是否存在,不存在 ,則以7爲退出嗎;判斷用戶的shell是否爲/bin/bash ,若是是 ,則顯示爲 「bash User」 退出嗎爲0 ,不然顯示「Not bash User 」 ,退出嗎爲1

#!/bin/bash
#
read -p "Enter a username: " userName
if ! id $userName &> /dev/null;then
    echo "The user not exit."
    exit 7
fi
userShell=`grep "^$userName\>" /etc/passwd | cut -d: -f7`     不要忘記錨定詞尾\> 
if [[ "$userShell" == "/bin/bash" ]];then
   echo "Bash User"
   retrunValue=0
else
   echo "Not Bash User"
   returnValue=1
fi
exit $returnValue


七、編寫一個腳本顯示以下菜單:,
  cpu)show cpu info
  mem) show memory info
  quit) quit
  Enter your option:
若是用戶選擇cpu ,則顯示文件/proc/cpuinfo 的信息
若是選擇mem ,則顯示文件/proc/meminfo的信息
若是選擇quit ,則推出,且退出碼爲5
若是用戶選擇其餘字符,則顯示未知選項,請從新輸入腳本,退出碼爲6

#!/bin/bash
#
cat << EOF
cpu)show cpu info;
mem)show memory info;
quit)quit
EOF
read -p "Enter your choice:" Choice
Choice=`$Choice | tr 'A-Z' 'a-z'`   ,把大寫字母轉化爲小寫字母
if [[ "$Choice" == "cpu" ]];then   ,注意字符加雙引號 ,且注意空格
   cat /proc/cpuinfo
elif [[ "$Choice" == "mem" ]];then
  cat /proc/meminfo
elif [[ "$Choice" == "quit" ]];then
  returnValue=5
else
  echo "Unknown options ,please run shell"
  retrunValue=6
fi
[  -z  $retrunValue ]  &&  returnVlaue=0   ,若是returnValue 未賦值 ,則returnValue =0 
exit $retrunValue


本章blog知識點彙總


bash特性之命令擴展 {,}

bash特性之符號引用及歷史命令:` `  ,‘’ ,「」  ,history

bash特性之變量:變量賦值 ,變量輸出, 本地變量,環境變量,局部變量 ,變量配置文件   

bash特性之命令別名及文件通配符 :# alias  #unalias

bash特性之快捷鍵及補全功能: 使用tab  補全命令或路徑 ,Ctrl + 不一樣的字母組合不一樣的含義

bash特性之管道與重定向 :  | 管道符  ,&> /dev/null  輸出重定向(包含正確及錯誤信息)  

bash特性之算數運算 : ++ ,+= ,let sum=$sum+$I

bash特性之條件判斷: 循環語句 for ,while ,until ;判斷語句 if ,case  格式

相關文章
相關標籤/搜索