文件歸檔,shell循環和函數運用

文件歸檔

tar

(1)  創建歸檔

tar -c -f / PATH/TO/SOMEFILE .tar FILE…

tar cf / PATH/TO/SOMEFILE .tar FILE…

blob.png

(2)  查看歸檔文件中的文件列表

tar -t -f  /PATH/TO/SOMEFILE .tar

(3)  展開歸檔

tar -x -f  /PATH/TO/SOMEFILE .tar

tar -x -f  /PATH/TO/SOMEFILE .tar -C  /PATH/

blob.png

結合壓縮工具實現:歸檔并壓縮

-j: bzip2, -z: gzip, -J: xz

blob.png

實現了歸檔壓縮,但是結合使用時,注意文件名后綴,不同的壓縮使用的后綴有差異,

cpio

 復制  從或到文件

? cpio 命令是通過重定向的方式將文件進行打包備份,還原恢復

的工具,它可以解壓以“.cpio” 或者“.tar” 結尾的文件。

? cpio [ 選項] >  文件名或者設備名

? cpio [ 選項] <  文件名或者設備名

?  選項

        -o  將文件拷貝打包成文件或者將文件輸出到設備上

        -i  解包,將打包文件解壓或將設備上的備份還原到系統

        -t  預覽,查看文件內容或者輸出到設備上的文件內容

        -v  顯示打包過程中的文件名稱。

        -d  解包生成目錄,在cpio 還原時,自動的建立目錄

        -c  一種較新的存儲方式

blob.png

使用實例    

將etc 目錄備份:

find ./etc -print |cpio -ov >etc.cpio

內容預覽

cpio –tv < etc.cpio

解包文件

cpio –iv <etc.cpio

cpio –idv < etc.cpio


shell腳本編程—–循環

for循環

for  變量名 in 列表 ;do

    循環體

done

執行機制:

    依次將列表中的元素賦值給”變量名“;每次賦值后即執行一次

循環體;知道列表中的元素耗盡,循環結束

列表生成方式

    1.直接給出列表

    2.整數列表:

        a.{start..end}

        b.${seq [start [step] end]}

    3.返回列表的命令

        $(command)

    4.使用glob,如:*.sh

    5.變量引用

        $@, $*

for練習:

? 1 、判斷/var/ 目錄下所有文件的類型

腳本:

  1 #!/bin/bash
  2 #qiuwei
  3 #2016-8-17
  4 #filetype
  5 for a in /var/*;do
  6     if  [[ -h $a ]];then
  7         echo "the file $a is a sysmbol file"
  8     elif [[ -b $a ]];then
  9         echo "the file $a is a block file"
 10     elif [[ -d $a ]];then
 11         echo "the file $a is a directory"
 12     elif [[ -f $a ]];then
 13         echo "the file $a is a common file"
 14     else
 15         echo "the file $a is a other file"
 16     fi
 17 done
~

blob.png

 2、 、 添加10個 個 用戶user1-user10 ,密碼 同 用戶名

  1 #!/bin/bash
  2 #qiuwei
  3 #2016-8-17
  4 #useradd
  5 
  6 for a in user{1..10};do
  7     if  id $a&>/dev/null;then     ====>判斷uesr是否存在
  8         echo "the user $a exist" &&echo $a |passwd --stdin $a ====>存在則顯示用戶存在,并修改密碼
  9     else
 10         useradd $a &&echo $a |passwd --stdin $a&&echo "the user $a create sucess"  ==>不成功就創建用戶,并修改密碼,顯示創建成功
 11     fi
 12 done
~

blob.png

 3 、/etc/rc.d/rc3.d 目錄下分別有多個以K 開頭和以S 開頭的

文件 ;分別 讀取每個文件,以K 開頭的文件輸出為文件加stop

,以S 開頭的文件輸出為文件名加start; ;

“ “K34filename stop”

“S66filename start”

腳本:

  1 #!/bin/bash
  2 #qiuwei
  3 #2016-8-17
  4 #---------
  5 
  6 for a in `ls /etc/rc.d/rc3.d`;do
  7     if  echo "$a"|grep -q "\<K.*";then
  8         echo -e "$a\tstop"
  9     elif echo $a |grep -q "\<S*";then
 10         echo -e "$a\tstart"
 11     fi
 12 done

blob.png

4 、寫 一個腳本 ,提示輸入正整數n 的值,計算1+2+3+…n的 的

總和

  1 #!/bin/bash
  2  read -p "please input a number:" c
  3  if echo $c|grep -q "^[0-9]\+$"&&[[ $c -ne 0 ]];then
  4     echo right number
  5  else
  6     echo "wrong number"&&exit
  7     fi
  8  b=0
  9  for a in `seq 1 $c`;do
 10  b=$[$a+$b]
 11  done
 12  echo $b
 
 ============================================================
 
   1 #!/bin/bash
  2  read -p "please input a number:" c
  3  if echo $c|grep -q "^[0-9]\+$"&&[[ $c -ne 0 ]];then
  4 
  5      b=0
  6      for a in `seq 1 $c`;do
  7      b=$[$a+$b]
  8     done
  9  else
 10     echo "wrong number"&&exit
 11     fi
 12  echo $b

blob.png

? 5、 、 寫一個腳本 ,提示請輸入網絡地址,如192.168.0.0 ,判

斷輸入的網段中主機在線狀態

腳本:

  1 #!/bin/bash
  2 #qiuwei
  3 #ip test
  4 
  5 read -p "please input a ip :" a
  6     if  echo $a|egrep "^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[    0-4][0-9]|25[0-5])$";then
  7         c=`echo $a|cut -d. -f4`
  8         b=`echo $a|cut -d. -f1-3`
  9         for i in `seq 1 $c`;do
 10             if  ping -c1 -w1 $b.$i &>/dev/null;then
 11                 echo -e  "\033[32mthe host $b.$i is onlin\033[0m"
 12             else
 13                 echo -e "\033[31mthe host $b.$i is offline\033[0m"
 14             fi
 15         done
 16     else
 17         echo "please input correct ip"
 18     fi

blob.png

? 6、 、 打印九九乘法表

腳本

  1 #!/bin/bash
  2 #qiuwei
  3 #9*9
  4 
  5 for i in `seq 1 9`;do
  6     for j in `seq 1 9`;do
  7         if [[ $i -ge $j ]];then
  8             sum=$[$i*$j]
  9             echo -ne  "$j*$i=$sum \t"
 10 
 11         fi
 12     done
 13     echo
 14 done

blob.png

while循環

while condition;do

    循環體

done

condition:循環控制條件;進入循環之前,先做一次判斷,每一次循環之后會再次做判斷;

    條件為true,則執行一次循環

    條件為false,則終止循環

因此:condition一般應該有循環制變量;且此變量的值會在循環體不斷的被修正

進入條件:condition為true    

退出條件:condition為false

whlie循環練習

? 1 、求100 以內所有正整數之和

  1 #!/bin/bash
  2 #qiuwei
  3 #sum100
  4 i=1 j=0
  5 while [[ $i -le 100 ]] ;do
  6     j=$[$i+$j]
  7     let i++
  8 done
  9 echo "the sum is $j"

blob.png

? 2 、通過ping 命令探測172.16.250.1-254 范圍內的所有主機

的在線狀態,統計在線主機和離線主機各多少。

腳本:

  1 #!/bin/bash

  2 #qiuwei

  3 #host online or not

  4 ip=10.1.252.

  5 i=1

  6 a=0

  7 b=0

  8 while [[ $i -le 254 ]];do

  9     if ping -c1 -w1 $ip$i &>/dev/null;then

 10         echo -e "\033[32mthe host $ip$i online\033[0m"

 11         let a++

 12     else

 13         echo -e "\033[31mthe host $ip$i offline\033[0m"

 14         let b++

 15     fi

 16     let i++

 17 done

 18 echo "the online host number is: $a"

 19 echo "the offline host number is: $b"

blob.png

 3 、打印九九乘法表

腳本

  1 #!/bin/bash
  2 #qiuwei
  3 #9*9
  4 i=1
  5 while [[ $i -le 9 ]];do
  6     j=1
  7     while [[ $j -le $i ]];do
  8         sum=$[$j*$i]
  9         echo -en "$j*$i=$sum \t"
 10         let j++
 11     done
 12     echo
 13     let i++
 14 done

blob.png

? 4 、利用變量RANDOM 生成10 個隨機數字,輸出這個10 數字

,并顯示其中的最大者和最小者

  1 #!/bin/bash
  2 #qiuwei
  3 #random
  4 i=1
  5 a=$RANDOM
  6 max=$a
  7 min=$a
  8 while [[ $i -le 10 ]];do
  9     if [[ $max -lt $a ]];then
 10         max=$a
 11     elif [[ $min -gt $a ]];then
 12         min=$a
 13     fi
 14         echo $a
 15         a=$RANDOM
 16     let i++
 17 done
 18 echo "the max number is $max"
 19 echo "the min number is $min"

blob.png

5 、打印國際象棋棋盤

  1 #!/bin/bash
  2 #qiuwei
  3 #chess
  4 i=1
  5 while [[ $i -le 8 ]];do
  6     j=1
  7     while [[ $j -le 8 ]];do
  8         a=$[$i+$j]
  9         b=$[$a%2]
 10         if [[ $b -eq 0 ]];then
 11             echo -ne "\033[41;1m  \033[0m"
 12         else
 13             echo -ne "\033[42;1m  \033[0m"
 14         fi
 15         let j++
 16     done
 17     echo
 18     let i++
 19 done

blob.png

until循環  ===>和while相反

until condition;do

    循環體

done

進入條件:condition 為false

退出條件:condition 為true

continue N:提前結束第N層的本輪循環,而直接進入下一輪判斷;最內層為第1層

while CONDTIITON1; do

    CMD1

    …

    if CONDITION2; then

        continue  ==>結束本輪循環,開始進行下輪判斷,false為進入,true為退出

    fi

    CMDn

    …

done

break N:提前結束第N層循環,最內層為第1層

while CONDTIITON1; do

    CMD1

    …

    if CONDITION2; then

        break  ==>直接結束整層循環,

    fi

    CMDn

    …

done

無限循環

while true;do

    循環體

done

until false;do

    循環體

done

until練習

 1 、每隔3 秒鐘到系統上獲取已經登錄的用戶的信息;如果發

現用戶hacker 登錄,則將登錄時間和主機記錄于日志

/var/log/login.log 中, 并提示該用戶退出系統。

  1 #!/bin/bash
  2 #qiuwei
  3 #host
  4 
  5 until `who|grep -q "^hacker\>"`;do
  6     sleep 3
  7     echo "finding...."
  8 done
  9 
 10 
 11 who|grep "^hacker\>"|tr -s " "|cut -d" " -f1,3,4 >>/var/log/login.log
 12 echo "please logout system"|mail hacker
 13 echo "reminded and login record in /var/log/login.log"

blob.png

? 2 、隨機生成10 以內的數字,實現猜字游戲,提示比較大或小

,相等則退出

  1 #!/bin/bash
  2 #qiuwei
  3 #guess
  4 
  5 a=$[$RANDOM%10+1]
  6 
  7 read -p "input a number:" b
  8 until [[ $a -eq $b ]];do
  9 
 10     if [[ $a -gt $b ]];then
 11         echo "intput a big number"
 12     else
 13         echo "input a small number"
 14     fi
 15     read -p "input a number:" b
 16 done
 17 echo "the number is right"

blob.png

3.用循環完成如下

   *

  ***

 *****

  1 #!/bin/bash
  2 #qiuwei
  3 #sangjiaoxing
  4 #規律為:第n行的空行個數為總行數-n,星星個數為2n-1,
  5 #所以我們在每一行打印對應的空格和星星數,
  6 read -p "please input a number:" a
  7 
  8     [[ $a =~ ^[0-9]+$ ]]&&[[ $a -ge 2 ]]
  9     [[ $? -ne 0 ]]&&echo "wrong number"&&exit
 10 #判斷輸入的數字,如果不是數字且大于等于2,就提示錯誤退出
 11 for line  in `seq 1 $a`;do
 12     for (( sapce=a-line;sapce>0;sapce-- ));do
 13         echo -n " "
 14         #打印空行
 15     done
 16     for (( xing=1;xing<=(line*2-1);xing++ ));do
 17         echo -n "*"
 18         #打印星星
 19     done
 20     echo
 21 done

blob.png

2、用until循環實現國際象棋棋盤

  1 #/bin/bash
  2 #qiuwei
  3 #用until循環實現國際象棋
  4 i=1
  5 until [[ $i -gt 8 ]];do
  6 
  7         j=1
  8     until [[ $j -gt 8 ]];do
  9         a=$[$[$i+$j]%2]
 10         if [[ $a -ne 1 ]];then
 11             echo -ne "\033[43;1m  \033[0m"
 12         else
 13             echo -ne "\033[42;1m  \033[0m"
 14 
 15         fi
 16         let j++
 17     done
 18     echo 
 19     let i++
 20 done

blob.png

特殊用法

while 循環的特殊用法(遍歷文件的每一行)

    while read line ;do

        循環體

    do < /path/from/somefile

依次讀取/path/from/somefile文件中的每一行,且將行賦值給變量line

練習

掃描/etc/passwd 文件每一行,如發現GECOS 字段為空,則填

充用戶名和單位電話為62985600 ,并提示該用戶的GECOS信 信

息修改成功

[root@localhost bin]# vim while6.sh

  1 #!/bin/bash
  2 #qiuwei
  3 #gecos
  4 while read line ;do
  5     a=`echo $line|cut -d: -f5`
  6     if  [[ -z $a ]];then
  7     b=`echo $line|cut -d: -f1`
  8         chfn -f $b $b &>/dev/null
  9         chfn -p 62985600 $b &>/dev/null
 10         echo "sucess"
 11     fi  
 12 done </etc/passwd

blob.png

 

雙小括號方法,即((…)),也可用于算術運算

blob.png

雙小括號也可以使bash sehll 實現C語言風格的變量操作

blob.png

for循環的特殊格式:

for ((控制變量初始化;條件判斷表達式;控制變量的修正表達式))

do    

    循環體

    done

  1 #/bin/bash
  2 #qiuwei
  3 for((a=1; a<10;a++));do
  6 #初始變量a,a小于10,則判斷成功,循環執行,a++為修正變量
  7     echo $a
  8     done
~

blob.png

控制變量初始化:僅在運行到循環代碼段時執行一次

控制變量的修正表達式:每輪循環結束會先進行控制變量修正運算

,而后再做條件判斷

select

select  variable in list    

    do

        循環體

    done

select循環主要用于創建菜單,按數字順序排列的示 菜單項將顯示在標準錯誤上,

并顯示 PS3  提示符,等待用戶輸入

select是個無限循環,所有如果不用break命令退出循環或exit退出腳本,循環無限執行

select經常和case一起使用

  1 #/bin/bash
  2 #qiuwei
  3 
  4 PS3="what do you want to eat:"
  5 
  6 select menu in ban you flash monkey ;do
  7     case $menu in
  8     ban)
  9         echo "this is ban"
 10         ;;
 11     you)
 12         echo "this is you"
 13         ;;
 14   flash)
 15         echo "I am the flash"
 16         ;;
 17  monkey)
 18         echo "this is a monkey"
 19         ;;
 20       *)
 21       echo "you are a hehe"
 22       break
 23       ;;
 24     esac
 25 done

blob.png

函數

函數function是由若干條shell命令組成的語句塊,實現代碼重用和模塊化編程

函數和shell程序相似,但是不能獨立運行,必須要調用才能運行,函數是在當前

shell中運行的,shell程序測試在子shell中運行的,因此在當前shell中,函數可以對

shell中變量進行修改

函數語法

  1. function f-name{

        …函數體…

    }

  2. f-name(){

       …函數體…  

   }

函數使用

函數的定義和使用:

    可在交互式環境下定義函數

    可將函數放在腳本文件中作為它的一部分

    可放在只包含函數的單獨文件中

調用:函數只有被調用才會執行,給點函數名即可

      函數名出現的地方,會被自帶替換為函數代碼

函數的生命周期:被調用時創建,返回時終止

函數和一般命令一樣,執行后有兩種返回值

結果返回值

    1.使用echo 或printf命令進行輸出

    2.函數體中調用命令的輸出結果

退出狀態碼

    1.取決于函數中執行的最后一條命令的退出狀態碼

    2.自定義

        return 默認為最后一條命令的狀態返回值

        return 0 無錯誤返回

        return 1-255 錯誤返回

注意:函數名不要和系統命令同名

簡單函數實例

  1 #/bin/bash
  2 #qiuwei
  3 #test
  4 
  5 fun(){
  6         echo "hello everyone ,I am the flash"
  7         }
  8     echo "I am the Iron Man"
  9     fun
 10     echo "You are stupid "
 11

blob.png

    

函數文件

可以將經常使用的函數存入函數文件,然后將函數文件載入shell,

一旦函數文件載入shell,就可以在命令行或腳本中調用函數

可以使用set命令查看所有定義的函數,可以看到所有已經載入shell的函數

若要改動函數,首先用unset命令從shell中刪除函數,改動完畢后,在從新載入此文件

實例

1.創建函數文件

  1 #/bin/bash
  2 #funfile
  3 #qiuwei
  4 
  5 funfile(){
  6 
  7         if [[ $# -lt 1 ]];then
  8             echo "please at least input a agr"
  9             return 1
 10         else
 11             echo $1
 12         fi
 13 
 14         }

2.載入shell

. funfile

source funfile  路徑要正確

然后用set檢查是否載入

blob.png

3.執行函數

blob.png

刪除shell函數

現在對函數做一些改動。首先刪除函數,使其對shell 不可用,使用unset 命令完成此功能

unset  funfile 

在使用set,函數不在顯示

函數參數

函數可以接受參數:

    傳遞參數給函數:調用函數時,在函數名后面以空白分隔給定參數列表即可

    在函數體中,可使用$1,$2…調用這些參數,還可以使用$@,#*.$#等等

函數變量

    環境變量:當前shell和子shell有效

    本地變量:只對當前shell進程有效。為執行腳本會啟動專用子shell進程;因此

本地變量的作用范圍是當前shell腳本程序文件,包括腳本中的函數

    局部變量:函數的生命周期;函數結束時變量被自動失效

定義局部變量 local  name=value

實例

   1 #/bin/bash
  2 a=qiuwei
  3 fun(){
  4      a=pingxiong
  5      echo $a
  6      }
  7 
  8 fun
  9 echo $a
~

結果為

blob.png

  1 #/bin/bash
  2 a=qiuwei
  3 fun(){
  4      local a=pingxiong
  5      echo $a
  6      }
  7      
  8 fun
  9 echo $a

blob.png

理解:函數和當前shell是在同一等級,如果直接變量賦值,就會覆蓋前面的變量賦值,

      ,如果想兩個變量同時生效,互不干擾,就必須使用局部變量了 ,如上,局部變量

        只用于函數中

函數遞歸

函數直接或間接調用自身,注意遞歸層數

遞歸實例:

階乘是基斯頓·于 卡曼于 1808  年發明的運算符號,是數學術語

一個正整數的階乘(factorial )是所有小于及等于該數的正整

數的積,并且有0 的階乘為1 。自然數n 的階乘寫作n!。 。

n!=1 ×2 ×3 ×… ×n。 。

階乘亦可以遞歸方式定義:0!=1 ,n!=(n-1)! ×n。 。

n!=n(n-1)(n-2)…1

n(n-1)! = n(n-1)(n-2)!

  1 #/bin/bash
  2 #qiuwei
  3 #遞歸函數
  4 fun(){
  5 
  6     if [ $1 -eq 0 -o $1 -eq 1 ];then
  7         echo 1
  8         #0和1的階乘為1
  9     else
 10 
 11         echo "$[$1*$(fun $[$1-1])]"
 12         #$1的階乘為$1*($1-1)階乘
 13         #注意以上格式
 14         fi
 15     }
 16 
 17 fun 7

blob.png

練習

? 1 、寫 一 個服務腳本/root/bin/testsrv.sh ,完成如下要求

(1)  腳本可接受參數:start, stop, restart, status

(2)  如果參數非此四者之一,提示使用格式后報錯 退出

(3)  如是start:則 則 創建/var/lock/subsys/ SCRIPT_NAME ,  并顯示“啟動成功”

考慮:如果事先已經啟動過一次,該如何處理?

(4)  如是stop:則 則 刪除/var/lock/subsys/ SCRIPT_NAME ,  并顯示“停止完成”

考慮:如果事先已然停止過了,該如何處理?

(5)  如是restart ,則先stop,  再start

考慮:如果本來沒有start ,如何處理?

(6)  如是status,  則如果/var/lock/subsys/ SCRIPT_NAME 文件存在,則顯示

“ SCRIPT_NAME is running…”

如果/var/lock/subsys/ SCRIPT_NAME 文件不存在,則顯示“ SCRIPT_NAME

is stopped…”

其中: SCRIPT_NAME 為當前腳 本名

腳本:

    1 #bin/bash
  2 #qiuwei
  3 #1 、寫 一 個服務腳本/root/bin/testsrv.sh ,完成如下要求
  4 #(1)  腳本可接受參數:start, stop, restart, status
  5 #(2)  如果參數非此四者之一,提示使用格式后報錯 退出
  6 #(3)  如是start:則創建/var/lock/subsys/ SCRIPT_NAME ,  并顯示“啟動成功”
  7 #考慮:如果事先已經啟動過一次,該如何處理?
  8 #(4)  如是stop:則刪除/var/lock/subsys/ SCRIPT_NAME ,  并顯示“停止完成”
  9 #考慮:如果事先已然停止過了,該如何處理?
 10 #(5)  如是restart ,則先stop,  再start
 11 #考慮:如果本來沒有start ,如何處理?
 12 #(6)  如是status,  則如果/var/lock/subsys/ SCRIPT_NAME 文件存在,則顯示
 13 #“ SCRIPT_NAME is running...”
 14 #如果/var/lock/subsys/ SCRIPT_NAME 文件不存在,則顯示“ SCRIPT_NAME
 15 #is stopped...”
 16 #其中: SCRIPT_NAME 為當前腳本名
 17 file=/var/lock/subsys/testscv
 18 start(){
 19 
 20     if [[ -f $file ]];then
 21         echo "$file is exsit"
 22     else
 23         touch $file && echo "start finshed"
 24 
 25     fi
 26     }
 27 
 28 stop(){
 29 
 30     if [[ -f $file ]];then
 31         rm -f $file && echo "stop finshed"
 32     else
 33         echo "No such file "
 34     fi
 35     }
 36 
 37 restart(){
 38 
 39     if [[ -f $file ]];then
 40         rm -f $file
 41         touch $file&&echo "start finshed"          =============>這個其實不需要,用stop和start組合下就好了
 42     else
 43         touch $file&&echo "start finshed"
 44     fi
 45     }
 46 
 47 status(){
 48 
 49     if [[ -f $file ]];then
 50         echo "$file is running...."          
 51     else
 52         echo "$file is stoped...."
 53     fi
 54     }
 55 
 56 
 57 read -p "input a arg:" i
 58 
 59 case $i in
 60      start)
 61         start
 62         ;;
 63       stop)
 64         stop
 65         ;;
 66    restart)
 67         stop
 68         start
 69         ;;
 70     status)
 71         status
 72         ;;
 73         *)
 74         echo "you should input {start|stop|restart|status}"
 75         ;;
 76 esac

blob.png

blob.png

 2 、編寫一個腳本/root/bin/copycmd.sh

(1)  提示用戶輸入一個可執行命令名稱;

(2)  獲取此命令所依賴到的所有庫文件列表

(3)  復制命令至某目標目錄( 例如/mnt/sysroot) 下的對應路徑下;

如:/bin/bash ==> /mnt/sysroot/bin/bash

/usr/bin/passwd ==> /mnt/sysroot/usr/bin/passwd

(4)  復制此命令依賴到的所有庫文件至目標目錄下的對應路徑下:

如:/lib64/ld-linux-x86-64.so.2 ==> /mnt/sysroot/lib64/ld-

linux-x86-64.so.2

(5) 每次復制完成一個命令后,不要退出,而是提示用戶鍵入新的要復制的命

令,并重復完成上述功能;直到用戶輸入quit

  1 #!/bin/bash
  2 #qiuwei
  3 # 2 、編寫一個腳本/root/bin/copycmd.sh
  4 #(1)  提示用戶輸入一個可執行命令名稱;
  5 #(2)  獲取此命令所依賴到的所有庫文件列表
  6 #(3)  復制命令至某目標目錄( 例如/mnt/sysroot) 下的對應路徑下;
  7 #如:/bin/bash ==> /mnt/sysroot/bin/bash
  8 #/usr/bin/passwd ==> /mnt/sysroot/usr/bin/passwd
  9 #(4)  復制此命令依賴到的所有庫文件至目標目錄下的對應路徑下:
 10 #如:/lib64/ld-linux-x86-64.so.2 ==> /mnt/sysroot/lib64/ld-
 11 #linux-x86-64.so.2
 12 #(5) 每次復制完成一個命令后,不要退出,而是提示用戶鍵入新的要復制的命
 13 #令,并重復完成上述功能;直到用戶輸入quit
 14 #2為至少輸入一個命令
 15 #3為輸入正確的命令
 16 copycmd(){
 17 
 18 if  [[ -z $i ]];then
 19      echo "please at least input a command"&&exit
 20 elif ! type $i &>/dev/null;then
 21        echo "$i is not a command,please input a right number"&&exit
 22        #判斷是否為命令
 23 else
 24     cmd=`whereis -b $i|cut -d" " -f2`
 25     #取命令文件路徑,設變量
 26     dir=`whereis -b $i|cut -d" " -f2|grep -o "/.*/"`
 27     #取名文件路徑
 28     #echo $cmd
 29     libfile=`ldd $cmd |egrep -o "/[^[:space:]]+"`
 30     #echo $libfile
 31     #取命令所依賴的庫文件列表
 32     mkdir -p  /mnt/sysroot$dir
 33     cp  $cmd  /mnt/sysroot$dir&& echo -e "\033[32mthe command $cmd mv sucess\033[0m"
 34     #復制命令
 35 
 36 for file in $libfile;do
 37     dir1=`echo $file|grep -o "/.*/"`
 38     #取庫文件路徑
 39     mkdir -p /mnt/sysroot$dir1
 40     cp $file  /mnt/sysroot$dir1 &&echo -e "\033[34mthe libfile $file mv sucess\033[0m"
 41     #賦值庫文件
 42 done
 43 fi
 44     read -p "please input a new command:" i
 45  }
 46 
 47 
 48 read -p "please input a command:" i
 49 while true ;do
 50 
 51     if [[ $i == quit ]];then
 52         exit
 53 
 54     else
 55     copycmd
 56     fi
 57 done

blob.png

?。。?!以上腳本還不完善,待補充(沒輸入命令或者錯誤命令時要完善)

原創文章,作者:qiuwei,如若轉載,請注明出處:http://www.www58058.com/36986

(0)
qiuweiqiuwei
上一篇 2016-08-21
下一篇 2016-08-21

相關推薦

  • Network Teaming網絡組總結

    一、Network Teaming網絡組的創建 第一步;準備工作,建立兩個網絡接口eth0、eth1,把原有網卡配置文件刪除; 命令:cd /etc/sysconfig/network-scripts                rm -rf ifcfg-* &nbs…

    2017-03-26
  • 馬哥教育網絡班20期+第5周課程練習

    1、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行; [root@localhost ~]# grep '^[[:space:]]\+' /boot/grub/grub.conf 2、顯示/etc/rc.d/rc.sysinit文件中以#開頭,后面跟至少一個空白字符,而后又有至…

    系統運維 2016-07-12
  • N22-草稿

    testing

    Linux干貨 2016-08-08
  • Linux介紹

    Linux簡介 Linux是一種自由和開放源代碼的類UNIX操作系統。該操作系統的內核由林納斯·托瓦茲在1991年10月5日首次發布。在加上用戶空間的應用程序之后,成為Linux操作系統。Linux也是自由軟件和開放源代碼軟件發展中最著名的例子。只要遵循GNU通用公共許可證,任何個人和機構都可以自由地使用Linux的所有底層源代碼,也可以自由地修改和再發布?!?/p>

    Linux干貨 2016-10-28
  • 正則表達式

    grep:Global search REgular expression and Print out the line         文本搜索工具,根據用戶指定的”模式“對目標文本逐行進行匹配檢查;打印匹配到的行        模式:由正則表達式字符及文本字符所編寫的過濾條件…

    Linux干貨 2016-08-08

評論列表(2條)

  • 馬哥教育
    馬哥教育 2016-08-22 10:45

    文章對shell腳本的基礎語法總結的很詳細,shell腳本的學習沒有特別的捷徑,熟悉了基本語法之后剩下的就是多寫多練,可以去網上找一些相對實用的腳本來學習哦。

欧美性久久久久