linux基礎6-shell程式設計
閱讀目錄
2.1:env命令的顯示
2.2:set命令的顯示
2.3:export命令的顯示
2.4:PS1命令提示符
2.5:bash下變數的設定的規則
2.6:linux語系的問題
2.7:鍵盤讀取變數和宣告變數
2.8:系統和個人設定值儲存的檔案
5、資料流重導向
6、管道命令
6.1:cut和grep的選取命令
6.2:sort、uniq、wc排序命令
6.4:引數代換xargs
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
2.5 bash下變數的設定的規則:
重點有三點:4、5、6
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-雙向重導向: