LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1588|回复: 2

BASH介绍(配置,SUBSHELL,JOE,重定向,SHELL语法)不知道是不是2OLD

[复制链接]
发表于 2003-2-7 02:58:24 | 显示全部楼层 |阅读模式
今天本来想找一些SHELL配置的文章,翻出这么一片,遂于兄弟分享。
来源:
http://www.ccu.edu.tw/center/ycnet/seminar/linux.89.7.4.doc

BASH環境介紹         日期:89/7/10

講師:郭錦賢

壹、認識shell

一、shell發展與角色

   1960年代,unix系統剛發展出?頃r,需要一個完整的使用者與作業系統溝通的介面。第一個出現的shell為AT&T S.R. Bourne 所發展的Bourne shell,也就是sh。以後又有Korn shell (ksh),BSD C shell (csh),Enhanced C shell (tcsh),等等,Linux預設使用shell為Bourne Again shell (bash),bash是根據sh發展出?恚瑫r具有csh及ksh的優點。

   shell本身是一個可執行的程式,它是使用者進入系統後,第一個執行的程式,它介於使用者與kernel之間,它幫使用者解譯指令,是使用者與機器之間的介面,主要工作是提供使用者一個良好的使用環境,讓使用者易於使用系統。

二、各種shell

1.sh  --Bourne shell,最早的shell,在Linux中/bin/sh是一個符號連結到/bin/bash。

2.ash   --ash是Small Bourne shell。是Linux裡最小的shell,內鍵功能也最少。執行檔為/bin/ash。

3.ksh  --Korn shell由sh發展而?恚琸sh缺乏工作控制指令。執行檔為/bin/ksh。

4.csh   --C shell語法與C很像,提供指令編輯、指令記錄,指令自動完成功能,在Linux中/bin/csh是一個符號連結到/bin/tcsh。

5.tcsh  --Enhanced C shell,是csh的加?姲妗绦袡n為/bin/tcsh。

6.bash  --Bourne Again shell擁有csh及ksh的特色,也供指令編輯、指令記錄,指令自動完成功能。執行檔為/bin/bash。

7.zsh   --Linux中最大的shell之一,功能也很?姟绦袡n為/bin/zsh。

三、進入shell

*檢視shell

echo $SHELL

cat  /etc/shells 使用者所使用的shell,除了有執行檔之外,也須列於/etc/shell檔案中。

*變更shell

   chsh

*提示符號(prompt)

shell   提示符號

bash   [\u@\h \W]\$

tcsh    [%n@%m %c]$

ash    $

ksh    [\u@\h \W]\$

zsh    \h%

四、使用不同的shell

     [guo@amigo guo]$ tcsh

   [guo@amigo ~]$

   [guo@amigo ~]$ exit

   exit

   [guo@amigo guo]$ ash

   $ exit

   [guo@amigo guo]$

貳、環境設定

   所謂環境指的就是各項shell下的控制及設定,包括終端機型式、檔案搜尋路?健⑹褂谜吣夸洝⑾到y提示符號等等。有關環境的控制都是透過環境變數?碓O定,每一個環境變數控制一項設定。

   [guo@amigo guo]$ env|more

   LESSOPEN=|/usr/bin/lesspipe.sh %s

   USERNAME=

   HISTSIZE=1000

   HOSTNAME=amigo

   LOGNAME=guo

   REMOTEHOST=140.123.3.56

   MAIL=/var/spool/mail/guo

   TERM=vt100

   HOSTTYPE=i386

PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/guo/bin:.

   KDEDIR=/usr

   HOME=/home/guo

   INPUTRC=/etc/inputrc

   SHELL=/bin/bash

   USER=guo

   BASH_ENV=/home/guo/.bashrc

   QTDIR=/usr/lib/qt-2.1.0

   LANG=en_US

   OSTYPE=Linux

*環境變數表示法:

     $環境變數

   [guo@amigo /]$ cd $HOME

   [guo@amigo guo]$

一、檢視環境變數

[guo@amigo guo]$ env|more

[guo@amigo guo]$ set|more

     *HOME  使用者家目錄

     *LOGNAME 使用者帳號名稱

*PATH 使用者執行指令尋找路?剑?脚c路?介g用:格開。

PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/guo/bin:.

     *PS1  設定主要提示符號

     *PS2  設定次要提示符號

     *PWD  目前工作目錄

     *SHELL 所使用的shell

     *TERM 定義終端機型式(linux 或 vt100)

     *MAIL 定義存放郵件的檔

二、設定環境變數

   1.顯示環境變數

[guo@amigo guo]$ echo $PATH

/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/guo/bin:.

[guo@amigo guo]$ echo $PS1

[\u@\h \W]\$

[guo@amigo guo]$ echo $SHELL

/bin/bash

[guo@amigo guo]$

     2.改變環境變數

     *指定變數值

   環境變數=變數值

[guo@amigo guo]$echo $PS1

[\u@\h \W]\$

[guo@amigo guo]$PS1="Linux> "  (單引號或雙引號都可以)

Linux> echo $PS1

Linux>

Linux> PS1='[\u@\h \W]\$'

[guo@amigo guo]$

     *改變路?皆O定

[guo@amigo guo]$echo $PATH

/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/guo/bin

[guo@amigo guo]$PATH="$PATH:." (只能使用雙引號)

[guo@amigo guo]$echo $PATH

/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/guo/bin:.

[guo@amigo guo]$   

三、環境變數的設定檔

   上述環境變數的設定只是暫時的,一旦logout系統,環境變數又會回到先前之設定,要讓環境變數設定每次進入系統都生效,就必須修改環境變數的設定檔。環境變數的設定分系統環境變數的設定與個人環境變數的設定兩種。

1.系統環境變數設定

   系統環境變數設定檔為/etc/profile及/etc/bashrc兩個檔案,所有使用者登入都會把這兩個檔案的環境變數設定加入自己環境中,一般的環境變數設定。

[guo@amigo guo]$ cat /etc/profile|more

# /etc/profile


# System wide environment and startup programs

# Functions and aliases go in /etc/bashrc


PATH="$PATH:/usr/X11R6/bin"


ulimit -c 1000000

if [ `id -gn` = `id -un` -a `id -u` -gt 14 ]; then

        umask 002

else

        umask 022

fi


USER=`id -un`

LOGNAME=$USER

MAIL="/var/spool/mail/$USER"


HOSTNAME=`/bin/hostname`

HISTSIZE=1000


if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then

        INPUTRC=/etc/inputrc

fi


export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC


for i in /etc/profile.d/*.sh ; do

        if [ -x $i ]; then

                . $i

        fi

done


unset i

[guo@amigo guo]$   


[guo@amigo guo]$ cat /etc/bashrc|more

# /etc/bashrc


# System wide functions and aliases

# Environment stuff goes in /etc/profile


# are we an interactive shell?

if [ "$PS1" ]; then

    if [ "x`tput kbs`" != "x" ]; then # We can't do this with "dumb" terminal

        stty erase `tput kbs`

    fi

    case $TERM in

        xterm*)

            PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'

            ;;

        *)

            ;;

    esac

    PS1="[\u@\h \W]\\$ "


    if [ "x$SHLVL" != "x1" ]; then # We're not a login shell

        for i in /etc/profile.d/*.sh; do

            if [ -x $i ]; then

                . $i

            fi

        done

    fi

fi


[guo@amigo guo]$  


2.個人環境變數設定

   個人環境變數設定檔為~/.bashrc及~/.bash_profile兩個檔案,所

[guo@amigo guo]$more .bashrc

# .bashrc


# User specific aliases and functions

alias rm='rm -i'

alias cp='cp -i'

alias mv='mv -i'


# Source global definitions

if [ -f /etc/bashrc ]; then

        . /etc/bashrc

fi

[guo@amigo guo]$more .bash_profile

# .bash_profile


# Get the aliases and functions

if [ -f ~/.bashrc ]; then

        . ~/.bashrc

fi


# User specific environment and startup programs


PATH=$PATHHOME/bin:.

BASH_ENV=$HOME/.bashrc

USERNAME=""


export USERNAME BASH_ENV PATH


[guo@amigo guo]$               

參、shell功能

一、輸入處理

    shell的重要工作就是處理使用者?逆I盤的輸入。使用者?逆I盤輸入的字元,在按下Enter鍵後,shell都會先行分析、解釋。使用者?逆I盤的輸入可能包括指令、指令群、shell變數、I/O導向、萬用字元等,shell都會先行展開各部分,再一一分析內容,最後執行該指令。

1.指令解析

    指令可分為二種,一種為Linux指令,如/bin、/usr/sbin下指令,另一種為shell內建指令,如cd、jobs、set等,?K沒有單獨檔案存在。

     Linux指令或shell內建指令,都有相同的指令格式:

          指令 [-選項]  [--選項]  [參數]

          ls --help

          ls  -la --color

2.使用多指令

   指令1;指令2;指令3;….

[guo@amigo guo]$ls;who;date

Desktop               cal2                  mtools-3.9.6-3.i386.rpm

Mail                  cal3                  pdadduser-1.2

a.c                   cc                    pdadduser-1.2.tar.gz

a.out                 export-listserv       pdadduser-1_2_tar.tar

aa                    file1                 perl

addUsers.zip          gmenu-0_1-3_i386.rpm  qe-0_0_34-1_i386.rpm

apache_1.3.12         listserv_tar.Z        qe-0_0_34_tar.tar

apache_1_3_12_tar.gz  ls1                   shell

apache_2_0a4_tar.gz   ls2                   sort1

b.tar                 ls3                   test

bb                    ls4                   ztelnet-linux.tar.gz

cal1                  lszip.zip

guo      pts/0    Jul  5 10:46

Wed Jul  5 14:27:51 CST 2000

[guo@amigo guo]$

3.指令替代

   指令替代就是直接將指令B執行的結果取代指令A的參數?韴绦兄噶預。格式如下:

               指令A  `指令B`

   指令B要放在反引號「`」裡,請注意反引號「`」跟單引號「'」的差別,他們在功能上是不同的。

[guo@amigo guo]$echo The precise time now is `date`

The precise time now is Wed Jul 5 14:39:55 CST 2000

[guo@amigo guo]$

4.指令群組

   使用者可以一次輸入許多指令?韴绦校敹嘀噶顖绦械慕Y果要以導向或管線?砝脮r,就需要以{}將多指令包成指令群組。

               {  指令1;指令2;指令3;….  }

注意:兩個{}與指令之間要空格

[guo@amigo guo]$ who;date | sort

guo      pts/0    Jul  5 10:46

Wed Jul  5 14:59:51 CST 2000

[guo@amigo guo]$ date;who | sort

Wed Jul  5 15:00:05 CST 2000

guo      pts/0    Jul  5 10:46

[guo@amigo guo]${ who;date }

guo      pts/0    Jul  5 10:46

Wed Jul  5 14:58:44 CST 2000

[guo@amigo guo]${ who;date } | sort

Wed Jul  5 14:58:48 CST 2000

guo      pts/0    Jul  5 10:46

[guo@amigo guo]$

5.子shell (subshell)

   subshell即為在login shell下,再開一個shell?韴绦兄噶睿锰幨窃趕ubshell中對環境及變數的改變不會影響原?韘hell的設定。subshell的執行方式是把指令放在( )內執行。指令格式:

          (  指令1;指令2;指令 )

[guo@amigo guo]$X='Hello!';echo $X

Hello!

[guo@amigo guo]$(X='BYE!';echo $X);echo $X

BYE!

Hello!

[guo@amigo guo]$

6.特殊字元

   a.#註解。凡是以#開頭輸入文字都不會被執行。

b.`單引號。在單引號'中間的字元都會被當作文字處理,指令、檔案、特殊字元都將不再有原?淼囊饬x。

[guo@amigo guo]$X='Hello!';echo $X

Hello!

[guo@amigo guo]$echo 'The value of $X is' $X

The value of $X is Hello!

[guo@amigo guo]$

c."與單引號'差不多,不過在雙引號"內的$及`保留變數替代及指令替代功能。

[guo@amigo guo]$echo "$X"

Hello!

[guo@amigo guo]$echo '$X'

$X

[guo@amigo guo]$echo "$X  `date`"

Hello!  Wed Jul  5 15:27:01 CST 2000

[guo@amigo guo]$

d.\ 脫離字元,讓特殊字元功能失效,變成文字字元使用。

[guo@amigo guo]$ls y.*

y.*  y.1  y.2

[guo@amigo guo]$ls y.\*

y.*

[guo@amigo guo]$

e.& 背景執行

f.$ 變數質替代

g.< 輸入導向

h.> 輸出導向

i.| 管線

j.! 執行指令記錄history裡的指令

k.; 分格指令

l.{ } 指令群組

m.(  ) 開啟subshell

n.`  ` 指令替代

o.萬用字元  * ? .  ..  [ ]
 楼主| 发表于 2003-2-7 02:59:02 | 显示全部楼层
二、指令功能

1.別名-alias

     alias 查看別名清單

     alias 別名='指令敘述' 設定別名

[guo@amigo guo]$alias

alias cp='cp -i'

alias l.='ls .[a-zA-Z]* --color=tty'

alias ll='ls -l --color=tty'

alias ls='ls --color=tty'

alias mv='mv -i'

alias rm='rm -i'

[guo@amigo guo]$alias copy='cp'

[guo@amigo guo]$alias

alias copy='cp'

alias cp='cp -i'

alias l.='ls .[a-zA-Z]* --color=tty'

alias ll='ls -l --color=tty'

alias ls='ls --color=tty'

alias mv='mv -i'

alias rm='rm -i'

[guo@amigo guo]$

2.指令記錄(history)

[guo@amigo guo]$history|more

  220  ls -l

  221  cd /var

  222  ls

  223  ls -l

[guo@amigo guo]$!220

[guo@amigo guo]$!!

3.自動完成指令

his Tab

[guo@amigo guo]$history

三、輸出/輸入(I/O)導向(Redirection)

   在Linux系統中每一個程式(process),都會有輸出、輸入及錯誤輸出三個通道(channel),分別為標準輸入(stdin)、標準輸出(stdout)及標準錯誤輸出(stderr)。導向的功能主要在於控制輸出、輸入及錯誤輸出檔案,可隨意變更標準輸入(stdin)、標準輸出(stdout)及標準錯誤輸出(stderr)檔案。

[guo@amigo shell]$ls

argument  bash   case2  catall  doctotxt  fordo  hello1   read

backup    case1  case3  checkf  exit1     hello  listbin  txttodoc

[guo@amigo shell]$ls >yy

[guo@amigo shell]$

1.導向控制

   a.指令< 檔案

   mail guo < file

   b.指令>檔案

   ls  > yy

   c.指令>>檔案

   date>>yy

   d.指令A|指令B

   ls|more

     ls|sort>file

四、工作控制功能(Jobs Control)

    1.工作與行程

info make

Ctrl+Z

vi test

Ctrl+Z

mail guo

Ctrl+Z

jobs

   ps

   2.前景與背景

        ls    (前景處理)

        ls&    (背景處理)

   3.顯示工作

        jobs

   4.控制工作

        指定工作

        %編號

        %字串

        %%

        %-


     例如:

        fg %1

        bg %2

        kill %1

肆、shell script撰寫

    一、建立與執行shell script

1.建立一個shell script檔

vi  hello (內容如下)

[guo@amigo shell]$ more hello

#!/bin/sh

# Filename : hello

echo "Hello world!"

a.編寫一個shell script檔內容

b.chmod  755  hello

2.執行shell script

a. ./hello

b.bash hello

c.source  hello

d.  . hello  (root才能使用)

二、變數

1.設定變數

a.直接設定

     格式:變數=值

                  x=hello

b.使用read指令

     echo 'What is your name ?'

     read  name

     echo  'Hello! '$name

c.指令取代

     y=`date`

                  echo  $y

d.指令參數

     格式:指令  參數1  參數2  參數3….

[guo@amigo shell]$ more argument

#!/bin/sh

# Filename : argument

echo 'argument1 is '$1

echo "argument2 is "$2

echo "argument3 is "$3

[guo@amigo shell]$ ./argument AA BB CC

argument1 is AA

argument2 is BB

argument3 is CC

2.變數的使用

   $變數名稱

   echo  $x

3.變數宣告後其他 subshell也可以使用該變數

   格式:export 變數名稱

   export  x

三、控制結構

test的使用(參考範例一、二)
case .. esac的使用(參考範例三)
if .. then .. fi的使用(參考範例四、五)
for .. in .. do .. done的使用(參考範例六)
while .. do .. done的使用(參考範例七、八)
until .. do .. done的使用(參考範例九)


參考範例一

[guo@amigo shell]$ test b = a

[guo@amigo shell]$ echo $?

1

[guo@amigo shell]$ test b = b

[guo@amigo shell]$ echo $?

0

參考範例二

[guo@amigo shell]$ [ b = a ]

[guo@amigo shell]$ echo $?

1

[guo@amigo shell]$ [ b = b ]

[guo@amigo shell]$ echo $?

0

參考範例三

[guo@amigo shell]$ more case1

#!/bin/sh

# Filename : case1

case $1 in

     start | begin)

        echo "start somthing"

     ;;

     stop | end)

        echo "stop somthing"

     ;;

     *)

        echo "nothing"

     ;;

esac

參考範例四

[guo@amigo shell]$ more ifthen

#!/bin/sh

# Filename : ifthen

echo "Are you O.K.(y/n)?"

read answer

if [ "$answer" = Y -o "$answer" = y ]

then

    echo "Glad to hear it."

fi  

參考範例五

[guo@amigo shell]$ more ifthenelse

#!/bin/sh

# Filename : ifthen

echo "Are you O.K.(y/n)?"

read answer

if [ "$answer" = Y -o "$answer" = y ]

then

    echo "Glad to hear it."

else

    echo "I am sorry."

fi   

參考範例六

[guo@amigo shell]$ more doctotxt

#!/bin/sh

# Filename : doctotxt

FILES=`ls /home/guo/test/*.doc`

for doc in $FILES

do

    txt=`echo $doc | sed "s/.doc/.txt/"`

    mv $doc $txt

done

參考範例七

[guo@amigo shell]$ more while1

#!/bin/sh

num=0

while [ $num -lt 10 ]

do

  echo  $num

  num=`expr $num + 1 `

done

echo "while end"

參考範例八

[guo@amigo shell]$ more while2

#!/bin/sh

echo "Guess a number,Please input a number :"

read num

while [ "$num" != "7" ]

do

  echo  "Wrong try again!"

  read num

done

echo You got it!

參考範例九

[guo@amigo shell]$ more until1

#!/bin/sh

num=0

until [ $num -gt 10 ]

do

  echo  $num

  num=`expr $num + 1 `

done

echo "until end"



JOE 編輯器

一. 概述

       JOE 是一種全螢幕的編輯器,它是由 Joseph H. Allen 撰寫出?,可用?

   編輯程式檔案及一般文字檔案。如果您需要 help , 請按 Ctrl-K-H 後, 會在

   Windows 最後一行出現 Basic  Windows  Advanced  Options  Search  Names

   Joe 等文字, cursor 停留在 Basic 上, 您可以使用左右鍵選您要 help 的項,

   再 Return 即可,取消 help 請再按一次 Ctrl-K-H 後即消失。(以下內容所有

   Ctrl 鍵,將以 ^ 符號代替,如 Ctrl-K-H 將以 ^KH 取代之)



二. 啟動 JOE


   %joe


   或


   %joe  filename



三. JOE 指令集


   1. 游標控制指令


      ^B   往左移一個字元(char)       ^F   往右移一個字元

      ^Z   往左移一個字(word)        ^X   往右移一個字

      ^P   往上移一行                ^N   往下移一行

      ^A   游標移至行首              ^E   游標移至行尾

      ^U   往上移一頁                ^V   往下移一頁

      ^KU  游標移至檔首             ^KV  游標移至檔尾

      ^KL  游標移至某行



   2. 刪除指令


      ^D  刪除游標所在的字元        ^Y  刪除游標所在的行

      ^O  往左刪除一個字(word)      ^W  往右移珊除一個字

      ^J  刪除?挠螛怂谧衷列形

      ^-  undo                      ^^  redo



   3. 區塊指令


      ^KB  定址區塊起始點           ^KK  定址區塊終止點

      ^KC  區塊拷?                 ^KM  區塊般移

      ^KW  區塊儲存                 ^KY  區塊刪除



   4. 搜尋和取代指令


      ^KF  尋找字串


          說明:在螢幕最下面會有一行,提示您輸入欲尋找的字串

         Search string (^C to abort):define

          按<return>後,提示畫面如下:

          (I)gnore case (B)ackwards (R)eplace n (^C to abort):

          可輸入 I 或 B 或 R

          I:   忽略大小寫

          B:  ?挠螛怂谖恢猛皩ふ

          R:  將出現另一提示畫面要求輸入欲取代之字串


      ^L  繼續尋找前一次尋找之字串



   5. 有關 Window 的指令


      ^KO  分割畫面(把一個畫面分割兩成二個畫面)

      ^KI  顯示一個視窗或全部視窗

      ^KP  將游標移至上一個視窗      ^KN  將游標移至下一個視窗

      ^KT  將游標所在的視窗範圍縮小  ^KG  將游標所在的視窗範圍放大



   6. 讀取檔案的指令


      ^KE  讀取檔案

      ^KR  讀取一檔案,存入目前開啟之檔案,游標所在行之後



   7. 存檔與離開 JOE 的指令


      ^KX  存檔且離開 JOE

      ^KD  存檔但仍在 JOE 狀態下

      ^C   不儲存被修改之檔案,直接離開 JOE



   8. 其它的指令


      ^TT  Insert/Overtype

      ^TA  Autoindent on/off

      ^TL  設定左邊界

      ^TR  設定右邊界

      ^TP  設定 PgUp/PgDn 的行數

      ^TD  設定 TAB 的長度

      ^KA  使整行文字向中對齊

      ^KZ  暫時離開 JOE 到 UNIX 系統下,欲回到 JOE,請輸入 fg

      ^K,   整個區塊(block)或段落(paragraph)向左移一個 bype

      ^K.   整個區塊(block)或段落(paragraph)向右移一個 bype

      ^KO  執行 UNIX 指令
发表于 2003-2-7 12:27:56 | 显示全部楼层
挺好~ ,89年的不算T~old;)不过要是简体版的就更好啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表