RHCE033--BASH
时间:2010-09-27 来源:twenty_four
- Shell:命令行解释器,是用户与系统沟通时的媒介。
- 在Unix系统中有各种Shell,Linux采用bash为其默认shell
- 系统可以使用的shell记录在/etc/shells中
- 在bash中输入history指令可以查询用户的过往操作。
- 内存中记录的过往指令数根据环境变量中HISTSIZE而定。
- 使用 ! 来调用过往指令:
- 用户可以alias来为一条命令取一个简单的别名。
- 在shell下键入alias可以查询当前alias列表。
- 用户也可以用unalias来取消一条别名记录。
- alias记录在shell中总是先行。
- 命令行输出——“ ”
- 数学运算——$[ ]
- 逸脱符——\
- 命令行结束符——;
- &&:当前一条指令执行成功时再执行后一条指令
- ||:当前一条指令执行失败时再执行后一条指令
- bash 在用户登录时从四个文件中读取环境设定:
- 其他shell设定文件
一、Shell简介
编写一个shell脚本:
[root@localhost ~]# vim 51cto.sh
[root@localhost ~]# cat 51cto.sh
#!/bin/bash
#author:twenty_four
#blog-link:http://twentyfour.blog.51cto.com/
#date:2010-10-27 21:30
echo `ls`
date //显示当前时间
[root@localhost ~]# chmod +x 51cto.sh //赋予执行权限
[root@localhost ~]# sh 51cto.sh //执行脚本
Mon Sep 27 06:32:43 PDT 2010
Red Hat Linux 中可用的shell:
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
/bin/ksh
二、Bash的预定义环境变量
在bash中有很多预定义环境变量
系统通过预定义环境变量来定义shell的环境
用户可以用set或env查询当前的环境变量
常用的预定义变量:
HOME:当前用户的主目录
PATH:当前用户的可执行文件搜索路径
LANG:程序应该使用的默认语言
可以用 ”echo $变量“ 的方式来查询变量的值:
[root@localhost ~]# echo $LANG
en_US.UTF-8
[root@localhost ~]# echo $HOME
/root
三、history
例如,history 10 会显示最后的10个命令:
[root@localhost ~]# history 10
544 chmod +x 51cto.sh
545 sh 51cto.sh
546 set
547 env
548 echo $HOME
549 echo $LANG
550 echo $PATH
551 echo $HOME
552 history
553 history 10 //看出这可是我敲的第553条命令
如果直接输入history会列出所有输入过的命令
[root@localhost ~]# HISTSIZE=20 //把记录的历史指令数定义为20条
[root@localhost ~]# history
535 chmod +x 51cto.sh
536 sh 51cto.sh
537 ls
538 rm 51cto*
539 ls 51
540 ls
541 vim 51cto.sh
542 cat 51cto.sh
543 chmod +x 51cto.sh
544 sh 51cto.sh
545 set
546 env
547 echo $HOME
548 echo $LANG
549 echo $PATH
550 echo $HOME
551 history
552 history 10
553 HISTSIZE=20
554 history
四、调用过往指令
!!:重复执行上一条指令
!a:重复执行上一条以a为首的指令
!number:重复执行上一条在history表中记录号码为number的指令
可以用<ctrl+r>来在history表中查询某条过往指令
[root@localhost ~]# ls 51cto.sh
51cto.sh
[root@localhost ~]# !! //重复执行上一条指令
ls 51cto.sh
51cto.sh
[root@localhost ~]# !ls //重复执行上一条以ls为首的指令
ls 51cto.sh
51cto.sh
[root@localhost ~]# history 3 //查看最后输入的3条命令
571 ls 51cto.sh
572 ls 51cto.sh
573 history 3
[root@localhost ~]# !572 //重复执行上一条在history表中号码为572的指令
ls 51cto.sh
51cto.sh
五、alias (别名)
大多数的shell中,别名是用来缩短长命令行或执行一连串短明令的一个简单方法。
我们可以在命令行下键入alias 51cto=‘ll’,以定义51cto为ll的一个别名,
例如:
[root@localhost ~]# ll
total 124
-rwxr-xr-x 1 root root 115 Sep 27 06:32 51cto.sh
-rw------- 1 root root 943 Sep 23 17:56 anaconda-ks.cfg
-rw-r--r-- 1 root root 30 Sep 26 19:42 cisco
…….
[root@localhost ~]# alias 51cto='ll' //定义ll的别名为51cto
[root@localhost ~]# 51cto //本身51cto是一个无效命令
total 124
-rwxr-xr-x 1 root root 115 Sep 27 06:32 51cto.sh
-rw------- 1 root root 943 Sep 23 17:56 anaconda-ks.cfg
-rw-r--r-- 1 root root 30 Sep 26 19:42 cisco
…...
[root@localhost ~]# alias
alias 51cto='ll'
alias cp='cp -i'
alias l.='ls -d .* --color=tty'
alias ll='ls -l --color=tty'
alias ls='ls --color=tty'
alias mv='mv -i'
alias rm='rm -i'
…….
[root@localhost ~]# unalias 51cto //取消别名
[root@localhost ~]# 51cto //发现命令无效了
-bash: 51cto: command not found
[root@localhost ~]# alias date='ls' //定义别名
[root@localhost ~]# date //发现date以别名生效,而不是显示日期了
51cto.sh cisco file1 install.log linux ok.txt
unix anaconda-ks.cfg Desktop file2 install.log.syslog
linuxer twenty_four
[root@localhost ~]# unalias date //去掉别名
[root@localhost ~]# date //显示时期
Mon Sep 27 07:24:14 PDT 2010
六、命令行表达式
将一串字符当成一个字符串来对待,如果字符串中包含特殊含义的字符,则转义。
命令行输出——‘ ’
将一串字符当成一个字符串来对待,如果字符串中包含特殊含义的字符,不转义。
执行引用符——` ` (后引号,针对命令,在后引号下的命令会执行)
引用命令的执行结果
例如:
[root@localhost ~]# cat 51cto.sh
#!/bin/bash
#author:twenty_four
#blog-link:http://twentyfour.blog.51cto.com/
#date:2010-10-27 22:40
var=hello //不是有效命令
echo "var is $var"
echo 'var is $var'
var=date //是有效命令
echo "$var"
echo `$var`
[root@localhost ~]# chmod +x 51cto.sh
[root@localhost ~]# sh 51cto.sh
var is hello //包含特殊含义的字符$,则转义生效
var is $var //直接输出
date //包含特殊含义的字符$,则转义生效
Mon Sep 27 07:47:37 PDT 2010 //在后引号下的命令会执行date
在中括号内的表达式会被数学计算
[root@localhost ~]# echo $[51+51]
102
用于取消命令行中字符的特殊含义:
[root@localhost ~]# mkdir aa\bb //加逸脱符" \ "后,系统认为空格非间隔符,
所以建立了一个目录aabb
[root@localhost ~]# ls
aabb
…..
[root@localhost ~]# cd aabb/
[root@localhost aabb]# mkdir aa bb //不加逸脱符 \ ,系统认为是建立两个目录aa 和 bb
[root@localhost aabb]# ls
aa bb
用于表示一行未结束:
[root@localhost ~]# 51cto\
> 51cto.com
-bash: 51cto51cto.com: command not found
看得出显示命令51cto51cto.com无效,所以命令被整合了
用于在一行内分隔两个独立命令,表示一行已结束,作用相当于回车键
[root@localhost ~]# date ; pwd
Mon Sep 27 08:16:10 PDT 2010 //这是date的结果
/root //这是pwd显示当前目录的结果
七、逻辑运算符
shell命令行支持在同一行的两条命令中插入&&(逻辑与)与 ||(逻辑或)
[root@localhost ~]# pwd && date
/root
Mon Sep 27 08:23:45 PDT 2010
[root@localhost ~]# 51cto || date
-bash: 51cto: command not found
Mon Sep 27 08:24:21 PDT 2010
八、定制登录shell
全局设置文件:
/etc/profile
/etc/bashrc
用户设置文件:
~/.bashrc
~/.bash_profile
~/.bash_logout:在用户logout的时候自动执行。
~/.bash_history:用户login时自动读取其内容并加载到内存history记录中,logout时将内存history记录写入。
/etc/profile.d/*.sh:在/etc/profile中被执行,其中的环境设定,也会被全局引用