高階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的值為空,則整個表示式的值等於給定的字串Hello,name保持不變;否則,整個表示式的值等於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所限定範圍的資料,n和m都是整數,即從輸入的字串中抽取第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