1. 程式人生 > >高階Shell/Tensorflow

高階Shell/Tensorflow

4.8  分析下列shell指令碼的功能:

count=$#

         cmd=echo

         while[  $count  –gt  0  ]

         do

                  cmd=”$cmd  \$$count”

                  ((count=count-1))

         done

         eval  $cmd

 

答:該指令碼的功能是:逆向輸出使用者在命令列上提供的各個引數。例如,設該指令碼名是ABC,執行該指令碼的命令列是:$ ABC  apple  big  cat  dog 

則結果輸出是:dog  cat  big  apple

4.9  編寫一個shell指令碼,它把第二個位置引數及其以後的各個引數指定的檔案複製到第一個位置引數指定的目錄中。

答:上機實踐題。參考指令碼如下:

       #!/bin/bash

      

count=$#

if [  -d  “$1”  ]

       then

              n=2

        dir=$1

while [  $n  –le  $count  ]

           do

                     if [  -f  $2  ]

then  cp  $2  $dir

else  echo  “$2  is  not an ordinary  file.”

fi

shift

                     ((n=n+1))

              done

       else  echo  “$1  is  not  a  directory.”

fi

 

4.10  編寫一個shell指令碼,顯示當天日期,查詢給定的某使用者是否在系統中工作。如果在系統中,就發一個問候給他。

答:上機實踐題。參考指令碼如下:

       #!/bin/bash

      

       date

       echo  “Input  a  user  name  for  searching”

       read  name

       if  who|grep  “$name”

       then

              echo  “Lucky, there  is  $name in  my  system  now.”

              echo  “Hi,how are you!” > /var/spool/mail/$name

       else  echo  “Unlucky, there  is not  $name in  my  system.”

       fi

 

4.11  列印給定目錄下的某些檔案,由第一個引數指出檔案所在的目錄,其餘引數是要列印的檔名。

答:上機實踐題。參考指令碼如下:

       #!/bin/bash

      

       count=$#

 if [  -d  “$1”  ]

        then

              cd  $1

n=2

           while[  $n  –le  $count  ]

           do

                     if [  -f  $2  ]

then  cat  $2

else  echo  “Sorry, cannot  display  $2.”

fi

shift

                     ((n=n+1))

              done

       else  echo  “$1  is  not  a  directory.”

fi

 

4.12  利用for迴圈將當前目錄下的 .c檔案移到指定的目錄下,並按檔案大小排序,顯示移動後指定目錄的內容。

答:上機實踐題。參考指令碼如下:

       #!/bin/bash

 

       echo  “Input  the  name  of  a  directory.”

       read  dir

if [  -d  $dir  ]

       then

for  name  in  *.c

              do

                     mv  $name  dir

              done

ls  -S  dir

              ls  dir

       else  echo  “Sorry!$dir  is  not  a  directory.”

       fi

 

4.13  利用陣列形式存放10個城市的名字,然後利用for迴圈把它們打印出來。

答:上機實踐題。參考指令碼如下:

#!/bin/bash

city=( Beijing Shanghai Tianjin Guangzhou Chongqing Hangzhou Nanjing Shenyang Taiyuan Jinan)

for i in ${city[*]}

do

echo $i

done

 

4.14  編寫一個shell指令碼,求費波納奇數列的前10項及總和。

答:上機實踐題。參考指令碼如下:

       #!/bin/bash

 

       fib[1]=1

fib[2]=1

       n=3

       ((sum= fib[1]+fib[2]))

       while [  $n  –lt  10  ]

       do

              ((fib[n]=fib[n-1]+fib[n-2]))

              ((fib[n+1]=fib[n-1]+fib[n]))

              ((sum=sum+fib[n]+fib[n+1]))

              ((n=n+2))

       done

       for ((i=1;i<=10;i++))

       do

              echo  ${fib[i]}

       done

       echo  $sum

 

4.15  下述表示式的作用是什麼?

${ name[*] }                   ${ name[@] }           ${ name #*/ }

${ name %%.* }                ${ #name[*] }         ${ name:-Hello }

答:${name[*]}和${name[@]}  都表示陣列name中所有非空元素的值,每個元素的值用空格分開。

${ name #*/ }  如果name值的開頭包含模式*/,那麼該表示式的值就是name中去掉最少匹配*/部分後的結果;否則,就是name的值。

${ name %%.* } 如果name值的末尾包含.*,那麼該表示式的值就是name中去掉最多匹配.*部分後的結果;否則,就是name的值。

${#nane[*]}的值是陣列name中已經設定的元素的個數。

${ name:-Hello }  如果name的值為空,則整個表示式的值等於給定的字串Helloname保持不變;否則,整個表示式的值等於name的值,name保持不變。

4.16  顯示前面所執行的40個命令的清單,重新執行倒數第5條命令。編輯其中一條命令,然後執行。

答:上機實踐題。

$ history 40

$ !-5

然後,按↑鍵或↓鍵,找到你要編輯的命令;

進行編輯;

按Enter鍵,執行該命令。

 

4.17  定義一個別名命令,它等價的功能是:顯示當前日期及工作目錄,並列出有多少使用者在系統上工作。

答:上機實踐題。

$ alias  cmd=’date;pwd;who|wc –l’

$ cmd

4.18  設計一個程式cuts,它由標準輸入讀取資料,獲取由第一個引數n和第二個引數m所限定範圍的資料,nm都是整數,即從輸入的字串中抽取第n個字元至第m個字元之間的所有字元(包括這兩個字元)。例如:

$ cuts  11  14

this is a test of cuts program (輸入)

test (顯示結果)

答:上機實踐題。參考指令碼如下:

 

#!/bin/bash 

read  -p  "Input a string: "  str

echo  $str | cut  -c  $1-$2