1. 程式人生 > >linux基礎6-shell程式設計

linux基礎6-shell程式設計

閱讀目錄

1、type [-ta] name

2、環境變數和自定義變數的顯示命令

3、命令別名與歷史命令

4、bash shell使用環境的終端的環境設定

5、資料流重導向

6、管道命令

1. type [-ta] name


一般情況下,type命令被用於判斷另外一個命令是否是內建命令,但是它實際上有更多的用法。
1.1.判斷一個名字當前是否是alias、keyword、function、builtin、file或者什麼都不是:

        type ls 的輸出是 ls 是 `ls --color=auto' 的別名

        type if 的輸出是 if 是 shell 關鍵字

        type type 的輸出是 type 是 shell 內嵌

        type gedit 的輸出是 gedit 是 /usr/bin/gedit

        type frydsh 的輸出是 bash: type: frydsh: 未找到

1.2.判斷一個名字當前是否是alias、keyword、function、builtin、file或者什麼都不是的另一種方法(適用於指令碼程式設計):

        type -t ls 的輸出是 alias

        type -t if 的輸出是 keyword

        type -t type 的輸出是 builtin

        type -t gedit 的輸出是 file

        type -t frydsh 沒有輸出

1.3.顯示一個名字的所有可能:

        type -a kill 的輸出是 kill 是 shell 內嵌 和 kill 是 /bin/kill

        type -at kill 的輸出是 builtin 和 file

1.4.檢視一個命令的執行路徑(如果它是外部命令的話):

        type -p gedit 的輸出是 /usr/bin/gedit

        type -p kill 沒有輸出(因為kill是內建命令)

1.5.強制搜尋外部命令:

        type -P kill 的輸出是 /bin/kill

2. 環境變數和自定義變數的顯示命令

2.1 env命令的顯示:

[[email protected] ~]# env
HOSTNAME=web -主機名稱
TERM=linux -終端
SHELL=/bin/bash -shell
HISTSIZE=1000 -歷史儲存命令書
SSH_CLIENT=58.222.185.248 1113 22 -登入ip 埠 ssh登入埠
SSH_TTY=/dev/pts/6 -遠端登入pts
ANT_HOME=/opt/apache/apache-ant-1.8.1
USER=root -使用者
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:.cmd=01;32:.exe=01;32:.com=01;32:.btm=01;32:.bat=01;32:.sh=01;32:.csh=01;32:.tar=01;31:.tgz=01;31:.arj=01;31:.taz=01;31:.lzh=01;31:.zip=01;31:.z=01;31:.Z=01;31:.gz=01;31:.bz2=01;31:.bz=01;31:.tz=01;31:.rpm=01;31:.cpio=01;31:.jpg=01;35:.gif=01;35:.bmp=01;35:.xbm=01;35:.xpm=01;35:.png=01;35:.tif=01;35: -顏色的設定資訊
SSH_AUTH_SOCK=/tmp/ssh-amfuW25778/agent.25778
MAIL=/var/spool/mail/root -mail
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/opt/apache/apache-ant-1.8.1/bin:/usr/ java/jdk1.6.0_20/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin -路徑
INPUTRC=/etc/inputrc -鍵盤
PWD=/root -當前工作路徑
JAVA_HOME=/usr/java/jdk1.6.0_20
LANG=zh_CN.GB18030 -語言
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SHLVL=1
HOME=/root
LOGNAME=root
CVS_RSH=ssh
SSH_CONNECTION=58.222.185.248 1113 218.23.142.44 22
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/bin/env

2.2 set命令的顯示

[[email protected] ~]# set | more
ANT_HOME=/opt/apache/apache-ant-1.8.1
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_COMPLETION=/etc/bash_completion
BASH_COMPLETION_DIR=/etc/bash_completion.d
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-RedHat-linux-gnu")
BASH_VERSION='3.2.25(1)-release'
COLORS=/etc/DIR_COLORS
COLUMNS=132 -顯示的列數
CVS_RSH=ssh
DIRSTACK=()
EUID=0
GROUPS=()
G_BROKEN_FILENAMES=1
HISTFILE=/root/.bash_history -history檔案儲存的地址
HISTFILESIZE=1000
HISTSIZE=1000
HOME=/root
HOSTNAME=web
HOSTTYPE=i686
IFS=$' \t\n'
INPUTRC=/etc/inputrc
JAVA_HOME=/usr/java/jdk1.6.0_20
LANG=zh_CN.GB18030
LESSOPEN='|/usr/bin/lesspipe.sh %s'
LINES=41
LOGNAME=root
LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:.cmd=01;3
2:
.exe=01;32:.com=01;32:.btm=01;32:.bat=01;32:.sh=01;32:.csh=01;32:.tar=01;31:.tgz=01;31:.arj=01;31:.taz=01;31:.lzh=01;31
:.zip=01;31:.z=01;31:.Z=01;31:.gz=01;31:.bz2=01;31:.bz=01;31:.tz=01;31:.rpm=01;31:.cpio=01;31:.jpg=01;35:.gif=01;35:.bmp
=01;35:.xbm=01;35:.xpm=01;35:.png=01;35:.tif=01;35:'
MACHTYPE=i686-RedHat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60 -每過60s檢查一次郵箱
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
--More--

後面還有PS1:命令提示符等

2.3 export命令的顯示:

將使用者自定義的變數程式設計環境變數用export
export 功能說明:設定或顯示環境變數。
語  法:export [-fnp][變數名稱]=[變數設定值]
補充說明:在shell中執行程式時,shell會提供一組環境變數。export可新增,修改或刪除環境變數,供後續執行的程式使用。export的效力僅限於該次登陸操作。
參  數:
 -f  代表[變數名稱]中為函式名稱。
 -n  刪除指定的變數。變數實際上並未刪除,只是不會輸出到後續指令的執行環境中。
 -p  列出所有的shell賦予程式的環境變數。

[[email protected] ~]# export
declare -x ANT_HOME="/opt/apache/apache-ant-1.8.1"
declare -x CVS_RSH="ssh"
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="web"
declare -x INPUTRC="/etc/inputrc"
declare -x JAVA_HOME="/usr/java/jdk1.6.0_20"
declare -x LANG="zh_CN.GB18030"
declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="root"
declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:.cmd=01;32:.exe=01;32:.com=01;32:.btm=01;32:.bat=01;32:.sh=01;32:.csh=01;32:.tar=01;31:.tgz=01;31:.arj=01;31:.taz=01;31:.lzh=01;31:.zip=01;31:.z=01;31:.Z=01;31:.gz=01;31:.bz2=01;31:.bz=01;31:.tz=01;31:.rpm=01;31:.cpio=01;31:.jpg=01;35:.gif=01;35:.bmp=01;35:.xbm=01;35:.xpm=01;35:.png=01;35:.tif=01;35:"
declare -x MAIL="/var/spool/mail/root"
declare -x OLDPWD
declare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/opt/apache/apache-ant-1.8.1/bin:/usr/java/jdk1.6.0_20/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
declare -x PWD="/root"
declare -x SHELL="/bin/bash"
declare -x SHLVL="1"
declare -x SSH_ASKPASS="/usr/libexec/openssh/gnome-ssh-askpass"
declare -x SSH_AUTH_SOCK="/tmp/ssh-amfuW25778/agent.25778"
declare -x SSH_CLIENT="58.222.185.248 1113 22"
declare -x SSH_CONNECTION="58.222.185.248 1113 218.23.142.44 22"
declare -x SSH_TTY="/dev/pts/6"
declare -x TERM="linux"
declare -x USER="root"

2.4 PS1命令提示符:

\d :代表日期,格式為weekday month date,例如:"Mon Aug 1"

  \H :完整的主機名稱。例如:我的機器名稱為:fc4.linux,則這個名稱就是fc4.linux

  \h :僅取主機的第一個名字,如上例,則為fc4,.linux則被省略

  \t :顯示時間為24小時格式,如:HH:MM:SS

  \T :顯示時間為12小時格式

  \A :顯示時間為24小時格式:HH:MM

  \u :當前使用者的賬號名稱

  \v :BASH的版本資訊

  \w :完整的工作目錄名稱。家目錄會以 ~代替

  \W :利用basename取得工作目錄名稱,所以只會列出最後一個目錄

  # :下達的第幾個命令

  $ :提示字元,如果是root時,提示符為:# ,普通使用者則為:$

如果想要設定終端提示符的樣式只要把$PS1在~/.bahrc指定即可比,比如我的設定如下:
設定一:
PS1="[\e[32m][\[email protected]\h \w]$[\e[m]"
export PS1
效果:
[[email protected] ~]$

設定二:

if [ $TERM = 'linux' ]; then
export PS1="[[\e[36;1m]\[email protected]\h [\e[31;1m]\w[\e[32;1m]]> "
zhcon --utf8
clear
elif [ $TERM = "xterm" ]; then
export PS1="[[\e[31;1m]\w\e[0m]> "
fi

linux PS1 提示符定義

2.5 bash下變數的設定的規則:


重點有三點:4、5、6

認識Bash這個Shell

2.6 linux語系的問題:

查詢當前使用的語系:echo $LANG

顯示系統支援的所有語系:locale -a

臨時修改語系

1 [[email protected]~]$ LANG=zh_CN.gb2312
2 [[email protected]~]$ echo $LANG
3 zh_CN.gb2312

永久修改語系

1 [[email protected]~]$ vi /etc/sysconfig/i18n
2 LANG="en_US.UTF-8"
3 SYSFONT="latarcyrheb-sun16"

使修改立即生效

1 [[email protected]~]$ source /etc/sysconfig/i18n

注:如果在修改語系後,仍然有亂碼,則需要修改編輯器的設定,設定方式如圖所示,需要將character encoding修改為對應的語系

2.7 鍵盤讀取變數和宣告變數:

read -p "please input your name:" -t 30 name

declare(轉自:http://www.cnblogs.com/fhefh/archive/2011/04/22/2024857.html)

declare或typeset內建命令(它們是完全相同的)可以用來限定變數的屬性.這是在某些程式語言中使用的定義型別不嚴格的方式。命令declare是bash版本2之後才有的。命令typeset也可以在ksh指令碼中執行。

declare/typeset 選項

-r 只讀

   1 declare -r var1

(declare -r var1與readonly var1作用相同)

這大致和C的const限定詞相同.一個試圖改變只讀變數值的操作將會引起錯誤資訊而失敗.

-i 整數

1 declare -i number
2 # 指令碼餘下的部分會把"number"當作整數看待.        
3 
4 number=3
5 echo "Number = $number" # Number = 3
6 
7 number=three
8 echo "Number = $number" # Number = 0
9 # 指令碼嘗試把字串"three"作為整數來求值(譯者注:當然會失敗,所以出現值為0).

某些算術計算允許在被宣告為整數的變數中完成,而不需要特別使用expr或let來完成。

1 n=6/3
2 echo "n = $n"       # n = 6/3
3 
4 declare -i n
5 n=6/3
6 echo "n = $n"       # n = 2

-a 陣列

1 declare -a indices

變數indices會被當作陣列.

-f 函式

   1 declare -f

在指令碼中沒有帶任何引數的declare -f 會列出所有在此指令碼前面已定義的函數出來。

   1 declare -f function_name

而declare -f function_name則只會列出指定的函式.

-x export

   1 declare -x var3

這樣將宣告一個變數作為指令碼的環境變數而被匯出。

-x var=$value
1 declare -x var3=373

declare命令允許在宣告變數型別的時候同時給變數賦值。

2.8 系統和個人設定值儲存的檔案:

執行順序依次為

/etc/profile

.bash_profile

.bashrc

/etc/bashrc

3. 命令別名與歷史命令

alias 別名='原命令'

  作用:設定別名

  別名設定存放在檔案 ~/.bashrc 中 ,修改這個檔案可永久生效 ~表示家目錄
eg:alias 顯示所有的alias設定

unalias 刪除別名

history [選項]

  作用:檢視使用過的命令

  引數:

  -c 清空歷史命令

  -w 把快取中的命令儲存到檔案中 檔案存放在~/.bash.history中 其中~代表家目錄

  說明:歷史命令預設儲存1000條 當超過1000條時會刪除開始的歷史命令 記錄下新的命令 ,預設設定在 /etc/profile 中

  echo $HISTSIZE 可以檢視歷史記錄的當前設定的條數
eg:history -w hisfile 把shell中的執行記錄寫入到hisfile中
:history -r hisfile 把hisfile中的命令記錄讀取到shell中

4. bash shell使用環境的終端的環境設定

4.1 stty -a:

stty -a 將當前所有的stty引數列出來

4.2 修改delete向前刪除為backspace向前刪除:

如上圖所示刪除為^?(delete)如果需要改成^H(bacespace)

則需使用以下命令

 eg:stty erase ^H

4.3 通用字元和特殊符號:

4.4 組合按鍵:

5. 資料重導向

5.1 資料重導向:

5.2 tee-雙向重導向:


5.3 命令執行的判斷依據:


6. 管道命令

6.1 cut和grep的選取命令:

6.2 sort、uniq、wc排序命令:

6.3 tr、col、join、paste、expand字元轉換命令:

6.4 引數代換xargs: