linux基础6-bash shell编程
1. type [-ta] name
![](https://i.imgur.com/ABAWYiG.png) 一般情况下,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. 环境变量和自定义变量的显示命令
![](https://i.imgur.com/kfCyDke.png)2.1 env命令的显示:
[root@www.linuxidc.com ~]# 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/env2.2 set命令的显示
[root@www.linuxidc.com ~]# 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赋予程序的环境变量。[root@www.linuxidc.com ~]# 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][\u@\h \w]$[\e[m]"
export PS1
效果:
[LinuxSong@test ~]$
设置二:
if [ $TERM = 'linux' ]; then
export PS1="[[\e[36;1m]\u@\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 [linux@linux~]$ LANG=zh_CN.gb2312
2 [linux@linux~]$ echo $LANG
3 zh_CN.gb2312
永久修改语系
1 [linux@linux~]$ vi /etc/sysconfig/i18n
2 LANG="en_US.UTF-8"
3 SYSFONT="latarcyrheb-sun16"
使修改立即生效
1 [linux@linux~]$ 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 系统和个人设定值存储的文件:
![](https://i.imgur.com/4axE72T.png)执行顺序依次为
/etc/profile
.bash_profile
.bashrc
/etc/bashrc
3. 命令别名与历史命令
![](https://i.imgur.com/aEnicDp.png)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