BASH環境介紹:Shell發展、種類與環境變數設定

格式
doc
大小
63.5 KB
頁數
18
上傳者
郭錦賢
收藏 ⬇️ 下載檔案
提示: 文件格式为 Word(doc / docx),轉換可能會出現排版或格式的些許差異,請以實際檔案為準。
此檔案建立於 2000-07-12,离现在 25 109 天,建議確認內容是否仍然適用。

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

講師:郭錦賢

壹、認識shell

一、shell發展與角色

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

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

二、各種shell

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

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

3.ksh --Korn shellsh發展而來,ksh缺乏工作控制指令。執行檔為/bin/ksh

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

5.tcsh --Enhanced C shell,是csh的加強版。執行檔為/bin/tcsh

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

7.zsh --Linux中最大的shell之一,功能也很強。執行檔為/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下的控制及設定,包括終端機型式、檔案搜尋路徑、使用者目錄、系統提示符號等等。有關環境的控制都是透過環境變數來設定,每一個環境變數控制一項設定。

[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 使用者執行指令尋找路徑,路徑與路徑間用:格開。

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]$

*改變路徑設定

[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 "33]0;${USER}@${HOSTNAME}: ${PWD}07"'

;;

*)

;;

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=$PATH:$HOME/bin:.

BASH_ENV=$HOME/.bashrc

USERNAME=""


export USERNAME BASH_ENV PATH


[guo@amigo guo]$

參、shell功能

一、輸入處理

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

1.指令解析

指令可分為二種,一種為Linux指令,如/bin/usr/sbin下指令,另一種為shell內建指令,如cdjobsset等,並沒有單獨檔案存在。

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。格式如下:

指令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.指令群組

使用者可以一次輸入許多指令來執行,當多指令執行的結果要以導向或管線來利用時,就需要以{}將多指令包成指令群組。

{ 指令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來執行指令,好處是在subshell中對環境及變數的改變不會影響原來shell的設定。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.`單引號。在單引號'中間的字元都會被當作文字處理,指令、檔案、特殊字元都將不再有原來的意義。

[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.萬用字元 * . .. [ ]

二、指令功能

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

三、控制結構

  1. test的使用(參考範例一、二)

  2. case .. esac的使用(參考範例三)

  3. if .. then .. fi的使用(參考範例四、五)

  4. for .. in .. do .. done的使用(參考範例六)

  5. while .. do .. done的使用(參考範例七、八)

  6. 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 指令





18


版權說明: 檔案資源由用戶上傳,僅供學習交流使用,尊重著作權。 若您認為內容涉及侵權,請點擊「侵權舉報」提交相關資料,我們將儘快核實並處理。