作者 主題: 小徒想整理 bash shell 一些基本語法 :(1)case (2)for (3)if (4)while  (閱讀 21592 次)

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

Anonymous

  • 訪客
-z file #if file exit and not null content

-z string #True if the length of string is zero
-n string #True if the length of string is nonzero
string1 = string2 #True if the strings are equal
string1 != string2 #True if the strings are not equal

num1 -eq num2 #true if num1 equal to num2
num1 -ne num2 #true if nmb1 not equal to num2
num1 -gt num2 #true if num1 greater than num2
num1 -lt num2 #true if num1 less than num2
-gt greaterthan -lt less than -le less & equal -ge greater & equal

! #mean NOT
-a #mean AND
-o #mean OR




(-1)

$@ 代表所有引數
$* 代表所有引數
$# 代表引數個數
$? 代表傳回值
$$ Process ID.
$0 Command name. 命令名稱
$n nth argument 第幾個引數 (0<n9).
$xxx 變數xxx的值

${xxx} 也是變數xxx的值,只是這樣定義較明確 (註一)
${xxx=ooo} 也是變數xxx的值

$() 命令的先執行後替換 例: ls -l $(type -path cc)
$(()) 數學的運算 例: $((2537%1000))

${} 裡有 : 的符號,代表在作字串的處理
${} 裡有 # 或 % 或 / 的符號,代表在作字串的比對及切割



(1)
代碼: [選擇]

Syntax

case string
in
   regex1)
   commands1
   ;;
   regex2)
   commands2
   ;;
   ...
esac





代碼: [選擇]

case $filename in
        *.gif ) exit 0 ;;
                                                                               
        *.tga ) tgatoppm $filename > $ppmfile ;;
                                                                               
        *.xpm ) xpmtoppm $filename > $ppmfile ;;
                                                                               
        *.pcx ) pcxtoppm $filename > $ppmfile ;;
                                                                               
        *.tif ) tifftopnm $filename > $ppmfile ;;
                                                                               
        *.jpg ) djpeg $filename > $ppmfile ;;
                                                                               
            * ) echo "procfile: $filename is an unknown graphics file."
                exit 1 ;;
    esac
                                                                               





代碼: [選擇]

case "$#" in
        0 | 1)  builtin cd $1 ;;
        2    )  newdir=$(echo $PWD | sed -e "s:$1:$2:g")
                case "$newdir" in
                    $PWD)   echo "bash: cd: bad substitution" >&2 ; return 1 ;;
                    *   )   builtin cd "$newdir" ;;
                esac ;;
        *    )  echo "bash: cd: wrong arg count" 1>&2 ; return 1 ;;
    esac




***shell 整理date

YY=`date +%y`
MM=`date +%m`
if [ $YY -lt 70 ]
then
   YY=`expr $YY + 89`
else
   YY=`expr $YY - 11`
fi
#if [ $MM -eq 1 ]
if [ $MM -eq 1 ]
then
   MM=`expr $MM + 11`
   YY=`expr $YY - 1`
else
   MM=`expr $MM - 1`
fi

if [ $MM -lt 10 ]
then
#  c_time="0"$(( $(date +%m)-1 ))
   MM="0"$MM
fi

echo user ftptest ftptest   > maieftp.ftp
#echo user anti 1    > maieftp.ftp
echo cd /file_tpy518F/  >> maieftp.ftp
#echo cd /u/src/nina/    >> maieftp.ftp
echo lcd /u/usms/data/njtr  >> maieftp.ftp
echo prompt  >> maieftp.ftp
echo put FD13$YY$MM.TXT  >> maieftp.ftp
echo put FD16$YY$MM.TXT  >> maieftp.ftp
echo put FDRA$YY$MM.TXT  >> maieftp.ftp
echo put OK$YY$MM.TXT   >> maieftp.ftp
echo bye  >> maieftp.ftp

ftp -n -i 172.16.200.36   < /u/acucobol/maieftp.ftp

小徒兒

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 622
    • 檢視個人資料
for
« 回覆 #1 於: 2004-08-17 20:41 »
代碼: [選擇]

for i in $(fdisk -l /dev/hda | awk '/^\/dev/ {print $1}'); do echo -n "$i :" ;e2label $i 2>/dev/null;done



代碼: [選擇]


for i in $(tail -n 2 /etc/passwd|cut -d: -f 1); do echo -n "$i :" ; userdel -r $i ; done



代碼: [選擇]

for (( i = 1; i <= 5; i++ )); do echo $i; done



代碼: [選擇]

makecmd ()
{
    read target colon sources
    for src in $sources; do
        if [ $src -nt $target ]; then
            while read cmd && [ $(grep \t* $cmd) ]; do
                echo "$cmd"
                eval ${cmd#\t}
            done
            break
        fi
    done
}
                                                                               


代碼: [選擇]

for filename in "$@"; do
    case $filename in
        *.gif ) convert=giftopnm  ;;
                                                                               
        *.tga ) convert=tgatoppm  ;;
                                                                               
        *.xpm ) convert=xpmtoppm  ;;
                                                                               
        *.pcx ) convert=pcxtoppm  ;;
                                                                               
        *.tif ) convert=tifftopnm  ;;
                                                                               
        *.jpg ) convert=djpeg ;;
                                                                               
            * ) echo "$0: Unknown filetype '${filename##*.}'"
                exit 1;;

    esac
                                                                               
    outfile=${filename%.*}.new.gif
                                                                               
    eval $convert $filename $scale $border $standardise > $outfile
                                                                               
done



代碼: [選擇]

for dir in $PATH; do
    if [ -z "$dir" ]; then dir=.; fi
                                                                               
    if ! [ -e "$dir" ]; then
        echo "$dir doesn't exist"
    elif ! [ -d "$dir" ]; then
        echo "$dir isn't a directory"
    else
        ls -ld $dir
    fi
done
                             
                                                   

[/code]

小徒兒

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 622
    • 檢視個人資料
if
« 回覆 #2 於: 2004-08-17 20:48 »
代碼: [選擇]
if [ "3" = $(runlevel | cut -d " " -f 2) ] ;then  export LANG=C; fi

代碼: [選擇]
trap 'echo Thank you for playing!' EXIT
 
magicnum=$(($RANDOM%10+1))
echo 'Guess a number between 1 and 10:'
while echo -n 'Guess: ' >&2 ; read guess ; do
    sleep 4
    if [ "$guess" = $magicnum ]; then
        echo 'Right!'
        exit
    fi
    echo 'Wrong!'
done




代碼: [選擇]


function cleanup {
    if [ -e $msgfile ]; then
          mv $msgfile dead.letter
    fi
    exit
}
 
trap cleanup INT TERM
 
msgfile=/tmp/msg$$
cat > $msgfile
# send the contents of $msgfile to the specified mail address...
rm $msgfile



代碼: [選擇]

{
    TERM=vt100       # assume this as a default
    line=$(tty)
    while read dev termtype; do
        if [ $dev = $line ]; then
            TERM=$termtype
            echo "TERM set to $TERM."
            break;
        fi
    done
} < /etc/terms
 
[/code]

小徒兒

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 622
    • 檢視個人資料
while
« 回覆 #3 於: 2004-08-17 20:51 »
代碼: [選擇]

loop () {
    trap "echo 'How dare you!'" INT
}
 
trap "echo 'You hit control-C!'" INT
loop
while true; do
    sleep 60
done


代碼: [選擇]
while getopts ":Ss:w:c:" opt; do
    case $opt in
      S  ) sharpness=' | pnmnlfilt -0.7 0.45' ;;
      s  ) size=$OPTARG
           scale=' | pnmscale -quiet -xysize $size $size' ;;
      w  ) width=$OPTARG
           border=' | pnmmargin $colour $width' ;;
      c  ) colour="-color $OPTARG"
           border=' | pnmmargin $colour $width' ;;
      \? ) echo $usage
           exit 1 ;;
    esac
done

小徒兒

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 622
    • 檢視個人資料
read
« 回覆 #4 於: 2004-08-17 22:16 »
代碼: [選擇]

NEW_IP=$((sleep 10;echo helo localhost; sleep 2; echo quit) \
| telnet msa.hinet.net 25 2>&1 \
| awk -F '[\]\[]' '/^250/{print $2}')





代碼: [選擇]

while read -e -p "bashdb> " cmd args; do
    case $cmd in
      \? | h  ) _menu ;;          # print command menu
      bc ) _setbc $args ;;        # set a break condition
      bp ) _setbp $args ;;        # set a breakpoint at the given line
      cb ) _clearbp $args ;;      # clear one or all breakpoints
      ds ) _displayscript ;;      # list the script and show the breakpoints
      g  ) return ;;              # "go": start/resume execution of the script
      q  ) exit ;;                # quit
      s  ) let _steps=${args:-1}  # single step N times (default = 1)
           return ;;
      x  ) _xtrace ;;             # toggle execution trace
     \!* ) eval ${cmd#!} $args ;; # pass to the shell
      *  ) _msg "Invalid command: '$cmd'" ;;
    esac
  done
[/code]

小徒兒

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 622
    • 檢視個人資料
shift
« 回覆 #5 於: 2004-08-17 22:26 »
代碼: [選擇]
# Set up the defaults
size=320
width=1
colour="-color black"
usage="Usage: $0 [-s N] [-w N] [-c S] imagefile..."
                                                                               
while getopts ":s:w:c:" opt; do
    case $opt in
      s  ) size=$OPTARG ;;
      w  ) width=$OPTARG ;;
      c  ) colour="-color $OPTARG" ;;
      \? ) echo $usage
           exit 1 ;;
    esac
done
                                                                               
[color=red]shift[/color] $(($OPTIND - 1))
                                                                               
if [ -z "$@" ]; then
    echo $usage
    exit 1
fi
                                                                               
# Process the input files
for filename in "$*"; do
    ppmfile=${filename%.*}.ppm
                                                                               
    case $filename in
        *.gif ) giftopnm $filename > $ppmfile ;;
                                                                               
        *.tga ) tgatoppm $filename > $ppmfile ;;
                                                                               
        *.xpm ) xpmtoppm $filename > $ppmfile ;;
                                                                               
        *.pcx ) pcxtoppm $filename > $ppmfile ;;
                                                                               
        *.tif ) tifftopnm $filename > $ppmfile ;;
                                                                               
        *.jpg ) djpeg $filename > $ppmfile ;;
                                                                               
            * ) echo "$0: Unknown filetype '${filename##*.}'"
                exit 1;;
    esac
                                                                               
    outfile=${ppmfile%.ppm}.new.gif
    pnmscale -quiet -xysize $size $size $ppmfile |
        pnmmargin $colour $width |
        ppmquant -quiet 256 | ppmtogif -quiet > $outfile
                                                                               
    rm $ppmfile
                                                                               
done

小徒兒

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 622
    • 檢視個人資料
test
« 回覆 #6 於: 2004-08-17 22:33 »
-d file

    True if file exists and is a directory

-e file

    True if file exists

-f file

    True if file exists and is a regular file

-L file

    True if file exists and is a symbolic link

-n string

    True if the length of string is nonzero

-r file

    True if file exists and is readable

-s file

    True if file exists and has a size greater than zero

-w file

    True if file exists and is writable

-x file

    True if file exists and is executable

-z string

    True if the length of string is zero

file1 -ot file2

    True if file1 is older than file2

string1 = string2

    True if the strings are equal

string1 != string2

    True if the strings are not equal

-o or

-a and

&& if tru then execute

|| if false then execute

小徒兒

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 622
    • 檢視個人資料
資料來源
« 回覆 #7 於: 2004-08-17 22:38 »
http://examples.oreilly.com/bash2/
[url[http://www.oreilly.com/catalog/lpicertnut/[/url]
netman 上課筆記

小徒兒

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 622
    • 檢視個人資料

funlonkon

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
netman 上課的筆記光是scripts 就那麼多噢,那不抄得很辛苦,應該有發講義吧!

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17438
    • 檢視個人資料
    • http://www.study-area.org
sorry, 我是從來不發講議的... ^_^
你看到的這位典範學生是我教過最勤奮用功的一個學生.
他所溫習的範圍, 許多已超出我在課堂上教的內容.
因此, 他能成為我見過的最短時間內能一次就通過 101 考試的學生也就不奇怪了!
難得的是, 他在第一堂課時, 對 linux 所知並不多...

所以說: 老師領入門, 修行在個人.
可見, 是否學到東西, 與老師發多少講議是無絕對關係的.

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17438
    • 檢視個人資料
    • http://www.study-area.org
引述: "netman"
因此, 他能成為我見過的最短時間內能一次就通過 101 考試的學生也就不奇怪了!

最新修改:

引用
因此, 他能成為我見過的最短時間內能一次就通過 101 & 102 考試的學生也就不奇怪了!