作者 主題: 2004-09-07 台南班(12)  (閱讀 10172 次)

0 會員 與 1 訪客 正在閱讀本文。

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17464
    • 檢視個人資料
    • http://www.study-area.org
2004-09-07 台南班(12)
« 於: 2004-10-20 16:54 »
2004-10-19(星期二)

* 溫習重點:
-test (!)
   [ -z "$STR" ] / [ -z $STR ]
 AND / OR operator
 if-then-else
 case
- loop
  for
  while
  until
-function
   name () { cmd; cmd; }
source (.) / exec
sample: /etc/rc.d/init.d/syslog


* 思考練習


1) 若執行如下命令:
unset var
[ $var = xyz ]
會看到甚麼結果:

請文如何解決之(最好能說明原理)?
方法一:
方法二:

2) 請用 return value 及 file descriptor 的概念來說明如下命令式:
   cmd1 && cmd2
   cmd1 || cmd2
   cmd1 && cmd2 || cmd3
   cmd1; cmd2; cmd3
   cmd1 | cmd2 | cmd3

3) 如下是 if 判斷式之格式內容:
   if command
   then
      command
      [command...]
   fi
請你寫出 if-elif-else 的格式內容:
   格式:




並請理解所謂的"多重條件判斷"的先後順序。

4) 請寫一個 if-elif-else 判斷式,其內容如下:
   1) 先判斷 script 是否有參數
   2) 若沒有,提示執行者輸入路逕,並定義為 file 變數
   3) 若 script 有參數,將 file 變數設為 $1 的值
   4) 判斷 file 變數是否目錄,然則,顯示 "dir"
   5) 再判斷 file 是否常規檔,然則,顯示 "file"
   6) 最後判斷 file 是否存在,然則不作任何動作. 否則,顯示 "not found"











5) 請你寫出 case 的格式內容:
   格式:




若我要你將上述 case 格式換成 if-elif-else 格式呢?
   格式:


6) 請寫一個 case 判斷式,其內容如下:
   1) 提示執行者輸入一種水果名稱,並定義為 fruit 變數
   2) 若輸入為 apple或Apple ,則顯示 "color is red"
   3) 若輸入為 banana或Banana ,則顯示 "color is yellow"
   4) 若輸入為 barlar或Barlar或bala或Bala或barla或Barla或balar或Balar ,則顯示 "color is green"
   5) 若是其他,則顯示 "color is unkown"







若改用 if-elif-else 來寫呢?







7) 請列出  shell script 常用的三種迴圈(loop)名稱:
   1:
   2:
   3:

並說說 for 迴圈的作用及過程。(提示:以變數值的數量來理解)
   說明:

8) 請寫一個 for 迴圈顯示如下結果:
   value is 1
   -------------
   value is 2
   -------------
   value is 3
   -------------
   value is 4
   -------------
   value is 5
   -------------
(注意:虛線也需要顯示出來。)






9) 假設 script 讀進的參數是 x "y z"(有 soft quote),
回圈的內容是:do echo $i; done
請問如下的 for 回圈的結果有何不同?
for i in "$*" :
for i in "$@" :
for i in $@ :
請問, 哪一個等同於 for i 呢?




10) 請以 return value 的概念來說說 while 跟 until 迴圈的差別:
   說明:

11) 請修改習題 6 的 script ,在 1) 與 2) 之間插入一個 while 迴圈:
   1) 判斷 fruit 變數是否為空的(也就是在執行者直接敲 Enter )?
   2) 若然,重新提示執行者輸入一種水果名稱,並定義為 fruit 變數
   3) 直到 fruit 變數非空為止






12) 請問啥是 command grouping?
能否舉一個應用例子?
   說明:



13) 請問 function 又叫甚麼名稱?
名稱:
請問你能用 function 取代上一題的 command group 嗎?
   說明:




14) 能否以 process 的觀念來說一說 shell cript 在 shell 與 command 之間的關係? 並說明與 source 與 exec 的差異.
   說明:


15) 請解讀 /etc/init.d/syslog 這隻 script 的內容:
代碼: [選擇]
#!/bin/bash
#
# syslog        Starts syslogd/klogd.
#
#
# chkconfig: 2345 12 88
# description: Syslog is the facility by which many daemons use to log \
# messages to various system log files.  It is a good idea to always \
# run syslog.
### BEGIN INIT INFO
# Provides: $syslog
### END INIT INFO

# Source function library.
. /etc/init.d/functions

[ -f /sbin/syslogd ] || exit 0
[ -f /sbin/klogd ] || exit 0

# Source config
if [ -f /etc/sysconfig/syslog ] ; then
        . /etc/sysconfig/syslog
else
        SYSLOGD_OPTIONS="-m 0"
        KLOGD_OPTIONS="-2"
fi

RETVAL=0

umask 077

start() {
        echo -n $"Starting system logger: "
        daemon syslogd $SYSLOGD_OPTIONS
        RETVAL=$?
        echo
        echo -n $"Starting kernel logger: "
        daemon klogd $KLOGD_OPTIONS
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/syslog
        return $RETVAL
}
stop() {
        echo -n $"Shutting down kernel logger: "
        killproc klogd
        echo
        echo -n $"Shutting down system logger: "
        killproc syslogd
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/syslog
        return $RETVAL
}
rhstatus() {
        status syslogd
        status klogd
}
restart() {
        stop
        start
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        rhstatus
        ;;
  restart|reload)
        restart
        ;;
  condrestart)
        [ -f /var/lock/subsys/syslog ] && restart || :
        ;;
  *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart}"
        exit 1
esac

exit $?



*next:
http://phorum.study-area.org/viewtopic.php?t=26980

rich-ju

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
2004-09-07 台南班(12)
« 回覆 #1 於: 2004-10-20 22:23 »
1) 若執行如下命令:
unset var
[ $var = xyz ]
會看到甚麼結果:  -bash: [ : = : unary operator expected  
                   echo $?  
                    2


請文如何解決之(最好能說明原理)?
方法一: var=xyz;[ $var = xyz ]
         echo $?
          0
方法二: unset var ; [ ! var = xyz ]
         echo $?
          0

ghel0917

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
[教學]第二題與第三題作答
« 回覆 #2 於: 2004-10-21 12:30 »
2) 請用 return value 及 file descriptor 的概念來說明如下命令式:
cmd1 && cmd2 :若cmd1與cmd2執行的結果均為true,return值才能得到0,只要有其中之為false,return=1
cmd1 || cmd2 :只要其中之一為true既會return true之值
cmd1 && cmd2 || cmd3 :(cmd1 && cmd2) || cmd3先處理左側兩值再與cmd3計算。
cmd1; cmd2; cmd3 :無論如何三者均會執行。
cmd1 | cmd2 | cmd3 :只要第一個cmd1執行出錯既會中止執行。

3) 如下是 if 判斷式之格式內容:
if command
then
command
[command...]
fi
請你寫出 if-elif-else 的格式內容:
格式:
if  command1
then
command2
[command…]
elif command3
then
command4
[command….]
else
command5
[command…]
fi
並請理解所謂的"多重條件判斷"的先後順序。
answer:當command1為true時則會執行command2,若command1為false則進入command3進行判斷如為true則執行command4,為否時則執行command5
ark

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17464
    • 檢視個人資料
    • http://www.study-area.org
2004-09-07 台南班(12)
« 回覆 #3 於: 2004-10-21 12:38 »
1) 解決方法應是:
[ "$var" = xyz ]
or:
[ x$var = xxyz ]

2) 全錯! 請再答.

ghel0917

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
[教學]第五題作答
« 回覆 #4 於: 2004-10-21 13:21 »
5) 請你寫出 case 的格式內容:
格式:
case “$VAR” IN
v1) command1
[command….]
;;
v2) command2
[command….]
;;
*) command3
[command….]
;;
esac

若我要你將上述 case 格式換成 if-elif-else 格式呢?
格式:
if “$var=v1” ; then
command1
[command…]
elif  “$var=v2” ; then
command2
[command…]
else
command3
[command…]
fi
ark

hor5651

  • 可愛的小學生
  • *
  • 文章數: 10
    • 檢視個人資料
Re: 2004-09-07 台南班(12)
« 回覆 #5 於: 2004-10-21 15:56 »
1) 若執行如下命令:
unset var
[ $var = xyz ]
會看到甚麼結果:
>>-bash: [ : = : unary operator expected

請文如何解決之(最好能說明原理)?
方法一:在兩個字串前都先給一個任何字串 (a)
>>[ a$var = axyz ]
方法二:
>>先set var再[ $var = xyz ]

2) 請用 return value 及 file descriptor 的概念來說明如下命令式:
   cmd1 && cmd2>>and
>>當cmd1為true時才會跑cmd2,當兩者均為true時,return value>>>true
   cmd1 || cmd2>>or

>>當cmd1為false時才會跑cmd2,只要其中一個條件可成立時,return value>>>true

   cmd1 && cmd2 || cmd3
>>先比對cmd1及cmd2 (and比對)再與cmd3作 or比對
>>若是cmd1及cmd2的結果為true時,再與cmd3作or比對時,就不跑cmd3
>>若是cmd1及cmd2的結果為false時,再與cmd3作or比對時,就跑cmd3

   cmd1; cmd2; cmd3
>>不論如何都會跑cmd1,2,3

   cmd1 | cmd2 | cmd3
>>當cmd1,2,3其中之一條件成立,才會run

3) 如下是 if 判斷式之格式內容:
   if command
   then
      command
      [command...]
   fi
請你寫出 if-elif-else 的格式內容:
   格式:
              if command1
then
command2
[command…]
elif command3
then
command4
[command….]
else
command5
[command…]
fi

請理解所謂的"多重條件判斷"的先後順序。
>>當command1為true時則會執行 theb (command2)
>>當command1為false則進入elif (command3)進行判斷
       >>當cmd3>>true則執行command4,
       >>當cmd3>>false執行command5

4) 請寫一個 if-elif-else 判斷式,其內容如下:
   1) 先判斷 script 是否有參數
   2) 若沒有,提示執行者輸入路逕,並定義為 file 變數
   3) 若 script 有參數,將 file 變數設為 $1 的值
   4) 判斷 file 變數是否目錄,然則,顯示 "dir"
   5) 再判斷 file 是否常規檔,然則,顯示 "file"
   6) 最後判斷 file 是否存在,然則不作任何動作. 否則,顯示 "not found"


你寫出 case 的格式內容:
   格式:
case “$VAR” IN [list argument]
1) command1
[command….]
;;
2) command2
[command….]
;;
*) command3
[command….]
;;
esac


我要你將上述 case 格式換成 if-elif-else 格式呢?
   格式:
if “$var=1” ; then
command1
[command…]
elif “$var=2” ; then
command2
[command…]
else
command3
[command…]
fi


6) 請寫一個 case 判斷式,其內容如下:
   1) 提示執行者輸入一種水果名稱,並定義為 fruit 變數
   2) 若輸入為 apple或Apple ,則顯示 "color is red"
   3) 若輸入為 banana或Banana ,則顯示 "color is yellow"
   4) 若輸入為 barlar或Barlar或bala或Bala或barla或Barla或balar或Balar ,則顯示 "color is green"
   5) 若是其他,則顯示 "color is unkown"



若改用 if-elif-else 來寫呢?




7) 請列出  shell script 常用的三種迴圈(loop)名稱:
   1:for
   2:while
   3:until

並說說 for 迴圈的作用及過程。(提示:以變數值的數量來理解)
   說明:
set i=1
for [ $i -le 6 ]
do
   echo $i
done
預期結果
1
2
3
4
5
6

8) 請寫一個 for 迴圈顯示如下結果:
set i=1
for [ $i -le 5 ]
do
   echo value is $i
   echo ---------------
done
   
   value is 1
   -------------
   value is 2
   -------------
   value is 3
   -------------
   value is 4
   -------------
   value is 5
   -------------
(注意:虛線也需要顯示出來。)


9) 假設 script 讀進的參數是 x "y z"(有 soft quote),
回圈的內容是:do echo $i; done
請問如下的 for 回圈的結果有何不同?
for i in "$*" :"x y z"
for i in "$@" :"x" "y z"
for i in $@ :"x" "y" "z"
請問, 哪一個等同於 for i 呢?
>>"$@"


10) 請以 return value 的概念來說說 while 跟 until 迴圈的差別:
   說明:
>>while:當條件為true時,迴圈才會執行
>>until:當條件為false時,迴圈才會執行

11) 請修改習題 6 的 script ,在 1) 與 2) 之間插入一個 while 迴圈:
   1) 判斷 fruit 變數是否為空的(也就是在執行者直接敲 Enter )?
   2) 若然,重新提示執行者輸入一種水果名稱,並定義為 fruit 變數
   3) 直到 fruit 變數非空為止




12) 請問啥是 command grouping?
能否舉一個應用例子?
start() {
        echo -n $"Starting system logger: "
        daemon syslogd $SYSLOGD_OPTIONS
        RETVAL=$?
        echo
        echo -n $"Starting kernel logger: "
        daemon klogd $KLOGD_OPTIONS
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/syslog
        return $RETVAL
}

   說明:
>>當我們要用到start內容功能的command時,用start來代替即可


13) 請問 function 又叫甚麼名稱?
名稱:
請問你能用 function 取代上一題的 command group 嗎?
   說明:




14) 能否以 process 的觀念來說一說 shell cript 在 shell 與 command 之間的關係?
>>一般shell cript在執行內容command後,會回到shell本層

並說明與 source 與 exec 的差異.
   說明:
>>source: . command (類似enviorment)

hor5651

  • 可愛的小學生
  • *
  • 文章數: 10
    • 檢視個人資料
2004-09-07 台南班(12)
« 回覆 #6 於: 2004-10-21 16:16 »
6) 請寫一個 case 判斷式,其內容如下:
1) 提示執行者輸入一種水果名稱,並定義為 fruit 變數
2) 若輸入為 apple或Apple ,則顯示 "color is red"
3) 若輸入為 banana或Banana ,則顯示 "color is yellow"
4) 若輸入為 barlar或barlar或bala或Bala或barla或Barla或balar或Balar ,則顯示 "color is green"
5) 若是其他,則顯示 "color is unkown"

set fruit

case $fruit in

apple|Apple)
   echo color is red
   ;;
banana|Banana)
   echo color is yellow
   ;;
barlar|Bala|barla|Barla|balar|Balar)
   echo color is green
   ;;
*)
   echo color is unkown
   ;;
esac

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17464
    • 檢視個人資料
    • http://www.study-area.org
2004-09-07 台南班(12)
« 回覆 #7 於: 2004-10-21 16:23 »
2) return value 以最後一個 command 為準.
請不要跟 test 的  -a 與 -o 搞混亂了....
cmd1 | cmd2 | cmd3  是指 stdout 用 pipe line 接到 stdin 去啦, 別忘了之前學的哦...  ^_^

5) case “$VAR” IN [list argument]
這寫法不對哦... 再看筆記?
還有, if “$var=1” ; then 應改為:
if [“$var”= 1 ]; then

7) & 8) for 寫錯了哦...

12) 所舉的不是 command grouping , 而是 function 了...  
看一下筆記?

13) 還沒答哦.

14) 嗯, 說得不夠經確. 提示: sub shell .

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17464
    • 檢視個人資料
    • http://www.study-area.org
2004-09-07 台南班(12)
« 回覆 #8 於: 2004-10-21 16:26 »
6)
沒有做到"提示執行者輸入一種水果名稱,並定義為 fruit 變數" 的要求哦?
tips: 用 echo + read.

且, 能否用 wildcard 來簡化 case 的內容呢?
比方 apple|Apple 可簡化為 [Aa]pple .

yyycome

  • 懷疑的國中生
  • **
  • 文章數: 37
    • 檢視個人資料
2004-09-07 台南班(12)
« 回覆 #9 於: 2004-10-23 01:09 »
呼呼~終於把script念完了~~
真慘 13節的功課都出來了
12才剛寫 ><
 :( 麻煩老師了

* 思考練習


1) 若執行如下命令:
unset var
[ $var = xyz ]
會看到甚麼結果:
-bash:[:=:unary operator expected]

請文如何解決之(最好能說明原理)?
方法一: [ "$var" = xyz ] (避免發生空字串的情況)
方法二: [ a$var  = axyz ](避免發生空字串的情況)
但這兩種方法也都會傳false的值
因為預設即是-n(字串是否相同),因此都是false

2) 請用 return value 及 file descriptor 的概念來說明如下命令式:
cmd1 && cmd2 (cmd1的值為ture時,執行cmd2)

cmd1 || cmd2 (cmd1的值為false時,執行cmd2)

cmd1 && cmd2 || cmd3
 1)cmd1的值為ture時,執行cmd2, cmd2若為flase則執行cmd3
 2)cmd1的值為flase時,則直接跑cmd3

cmd1; cmd2; cmd3 (cmd1跑完,執行cmd2,cmd2完執行cmd3)

cmd1 | cmd2 | cmd3
 (pipe,cmd1跑完的結果送到cmd2,cmd2跑完的結果再送到cmd3)

3) 如下是 if 判斷式之格式內容:
if command
then
command
[command...]
fi
請你寫出 if-elif-else 的格式內容:
格式:
if command;then
command
elif command;then
command
else
command
fi




並請理解所謂的"多重條件判斷"的先後順序。

4) 請寫一個 if-elif-else 判斷式,其內容如下:
1) 先判斷 script 是否有參數
2) 若沒有,提示執行者輸入路逕,並定義為 file 變數
3) 若 script 有參數,將 file 變數設為 $1 的值
4) 判斷 file 變數是否目錄,然則,顯示 "dir"
5) 再判斷 file 是否常規檔,然則,顯示 "file"
6) 最後判斷 file 是否存在,然則不作任何動作. 否則,顯示 "not found"
if [ ! "$1" ];then
  echo "Enter your path :"
  read file
else
file=$1
fi

  if [ -d "$file" ];then
  echo dir
  elif [ -f "$file" ];then
  echo "file"
  elif ["$file"];then
  echo
  else
  echo "not found"
  fi



5) 請你寫出 case 的格式內容:
格式:
read var
case "$var" in
v1)
command ;;
v2)
command ;;
v3)
command ;;
esac

若我要你將上述 case 格式換成 if-elif-else 格式呢?
格式:
read var
if [ $var = v1];then
command
elif [$var = v2];then
command
else
command
fi


6) 請寫一個 case 判斷式,其內容如下:
1) 提示執行者輸入一種水果名稱,並定義為 fruit 變數
2) 若輸入為 apple或Apple ,則顯示 "color is red"
3) 若輸入為 banana或Banana ,則顯示 "color is yellow"
4) 若輸入為 barlar或Barlar或bala或Bala或barla或Barla或balar或Balar ,則顯示 "color is green"
5) 若是其他,則顯示 "color is unkown"
echo -n "Please enter a fruit :"
read fruit
case "$fruit" in
[Aa]pple)
echo "color is red";;
[Bb]anana)
echo "color is yellow";;
[Bb]alar|[Bb]ala|[Bb]arla|[Bb]alar)
echo "color is green" ;;
*)
echo "color is unkown" ;;
esac

若改用 if-elif-else 來寫呢?
第三個不知道怎麼判斷

echo -n "Please enter a fruit :"
read fruit
if [ "$file" = apple -o "$file" = Apple ];then
echo "color is red"
elif [ "$file" = banana -o "$file" = Banana ];then
echo "color is yellow"
elif [ "$file" = barlar -o "$file" = Barlar ];then
echo "color is green"
elif [ "$file" = bala -o "$file" = Bala ];then
echo "color is green"
elif [ "$file" = barla -o "$file" = Barla ];then
echo "color is green"
elif [ "$file" = balar -o "$file" = Balar ];then
echo "color is green"
*)
echo "color is unknown"
fi

7) 請列出 shell script 常用的三種迴圈(loop)名稱:
1: for
2: while
3: until

並說說 for 迴圈的作用及過程。(提示:以變數值的數量來理解)
說明:
for var in "$@"
do
command
done
其作用是將user打入參數內容,一一列出

8) 請寫一個 for 迴圈顯示如下結果:
value is 1
-------------
value is 2
-------------
value is 3
-------------
value is 4
-------------
value is 5
-------------
(注意:虛線也需要顯示出來。)
for ((i=1 ; i<=5 ; i++))
do
echo "valuse is $i"
echo -------------
done


9) 假設 script 讀進的參數是 x "y z"(有 soft quote),
回圈的內容是:do echo $i; done
請問如下的 for 回圈的結果有何不同?
for i in "$*" :
x y z
for i in "$@" :
x
y z
for i in $@ :
x
y
z
請問, 哪一個等同於 for i 呢? "$@"


10) 請以 return value 的概念來說說 while 跟 until 迴圈的差別:
說明:
當return value的值符合while的command時,繼續跑,不符合就跳出
當return value的值不符合until的command時,繼續跑,符合就跳出

11) 請修改習題 6 的 script ,在 1) 與 2) 之間插入一個 while 迴圈:
1) 判斷 fruit 變數是否為空的(也就是在執行者直接敲 Enter )?
2) 若然,重新提示執行者輸入一種水果名稱,並定義為 fruit 變數
3) 直到 fruit 變數非空為止
while [ -z "$fruit" ];do
echo "enter a fruit :"
read fruit
done





12) 請問啥是 command grouping?
能否舉一個應用例子?
說明:
其格式如下
{
command
[command]
}
or
{ command[;command;command] }

例:
{[ "$1" ]||echo "$1 dont exit."
exit 1
}


13) 請問 function 又叫甚麼名稱?
名稱:函數 (name command group)
請問你能用 function 取代上一題的 command group 嗎?
說明:
bye () {
[ "$1" ]||echo "$1 dont exit."
exit 1
}

14) 能否以 process 的觀念來說一說 shell cript 在 shell 與 command 之間的關係? 並說明與 source 與 exec 的差異.
說明:
還不太懂
df

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17464
    • 檢視個人資料
    • http://www.study-area.org
2004-09-07 台南班(12)
« 回覆 #10 於: 2004-10-23 19:52 »
4)下面這行要改一下:
elif ["$file"];then
應是:
elf [ -e "$file" ]; then # 請留意 -f 以及 IFS ...

5) 也是有錯, 請留意 if-then 裡那些 test 的 IFS ...

10) 不是符不符合的意思, 這樣不夠明確. 應是看 return value 是 true 還是 false 來決定 while 與 until 迴圈的執行.

12)
{ command[;command;command] }
改為:
{ command;[command;command;] }  


14)
可先看看:
http://bbs.chinaunix.net/forum/viewtopic.php?p=1583329#1583329