什么是Shell:Shell是kernel之外的指令解析器
是一个程序,同时也是一种命令语言和程序设计语言
Shell中可运行子Shell
Shell的类型:ash、bash、ksh、csh、tcsh,一般RedHat Linux使用bash
[root@TIPTOP /root]# cat/etc/shells #查看系统中有哪些Shell,可查看文件/etc/shells
[root@TIPTOP /root]# echo$SEHLL #查看当前使用的Shell
[root@TIPTOP /root]# /bin/ksh #直接改变Shell,使用ksh解释运行Shell脚本
[root@TIPTOP /root]# exit #退出/bin/ksh这个子Shell
bash特点:
1、方向↑↓箭,可方便查看历史命令,从而快速执行
2、命令行下,头字母下快速两次TAB键,可自动带出以该字母开头的命令
3、输入help命令,直接返回bash内置的常见的N多命令
4、``命令替换
[root@TIPTOP /root]# ll `cat test` #即将cat test的结果传给ll命令,类似管道符
5、可用''或'' ''或\转义特殊字符
[root@TIPTOP /root]# touch dir1 dir2 #表示创建dir1和dir2两个文件
[root@TIPTOP /root]# touch dir1\ dir2 #表示只创建dir1 dir2这一个文件
[root@TIPTOP /root]# touch 'dir1 dir2' #同上
6、; 允许在一行放多个命令
& 使命令后台执行
() 创建成组命令
{} 创建命令块
| 管道
<>& 重定向
*?[]! 模式匹配
$ 变量名的开头
# 注释
空格、制表符、换行符 全部当做空白
Shell变量什么是Shell变量:内存中的一块,存取变量值
本地变量:只在用户现在的Shell生命周期的脚本中使用,子shell生命周期也不存在
[root@TIPTOP /root]# localtest="test" #创建本地变量
[root@TIPTOP /root]# echo ${localtest} #或echo $localtest
[root@TIPTOP /root]# readonly localtest #设置本地变量localtest为只读变量,则不可对其再赋值
#设置成只读变量后则不能够再变回可写变量了
[root@TIPTOP /root]# readonly #查看当前shell下有哪些只读变量
[root@TIPTOP /root]# set #命令可显示本地所有的变量(包含本地及环境变量)
环境变量:用于所有用户进程(包含当前Shell及其所有子进程,包括编辑器、脚本、和应用;登陆进程成为父进程,shell中执行的用户进程均称为子进程)
一般于下面两个文件中设置:$HOME/.profile 或 $/HOME/.bash_profile 个人配置文件;/etc/profile 全局配置文件
[root@TIPTOP /root]# export gobaltest="test" #创建环境变量gobaltest,赋值为test
[root@TIPTOP /root]# export #可显示所有的环境变量
[root@TIPTOP /root]# env #可显示所有的环境变量
变量替换(显示变量):即用变量名显示变量值
[root@TIPTOP /root]# AXM="/u1/tiptop/axm"
[root@TIPTOP /root]# echo $AXM #则显示的值就是/u1/tiptop/axm
[root@TIPTOP /root]# echo ${AXM} #则显示的值就是/u1/tiptop/axm
${variablename} 显示variablename的实际值
${variablename:+value} 如果设置了variablename,则显示其值,否则为空
${variablename:?value} 如果未设置variablename,则提示错误信息,信息为value
如果设置了variablename,则显示variablename的值
${variablename:-value} 如果未设置variablename,则显示value值
如果设置了variablename,则显示variablename的值
${variablename:=value} 如果未设置variablename,则设置其值为value并显示
如果设置了variablename,则显示variablename的值
清除变量:[root@TIPTOP /root]# unset AXM #清除AXM这个变量
#readonly的变量不可unset清除
位置变量:用于向系统命令传递参数或向脚本传参
$0:表示脚本名字
$1至$9:传递参数
标准变量:系统预置的一些标准变量,于/etc/profile文件中定义
$EXINIT:vi的一些设置
$HOME:用户的根目录
$IFS:分割符号(ex:$PATH变量中的分割符号)
$LOGNAME:登陆用户的用户名
$MAIL:当前用户存储的邮箱放置地方
$MAILCHECK:每隔多少秒检查是否有邮件
$MAILPATH:如果有多个邮件时,定义邮件的存放位置
$PATH:可执行文件去寻找的路径
$PS1:命令行提示符(ex:[\u@\h \W]\$ 即表示[用户名@主机名当前路径]$)
$PS2:命令行Shell编辑时,分行后首字符的提示符号
$SHELL:当前使用的是什么Shell
$TERM:系统登陆后默认的终端类型
$TERMINFO:终端类型的配置信息
$TZ:时区
$EDITOR
$PWD:当前目录
$MANPATH:帮助文档的路径
特殊变量
$#: 传递到脚本的参数个数
$*: 以一个单字符串显示所有向脚本传递的参数
与位置变量不同,此选项参数可超过9个
$$: 脚本运行的当前进程ID号
$!: 后台运行的最后一个进程的进程ID号
$@:与$*相同,但是使用时加引号,并在引号中返回每个参数
$-: 显示shell使用的当前选项,与set命令功能相同
$?: 显示最后命令的退出状态,0表示成功,其他任何值都表示有错误
影响变量的命令
declare:设置或显示变量
-f 只显示函数名
-r 创建只读变量(declare和typeset)
-x 创建转出变量
-i 创建整数变量
使用+替代-,可以颠倒选项的含义,但是-r设置只读变量后就不可颠倒了
exprot:用于创建环境变量
-- 表明选项结束,所有后续参数都是实参
-f 表明在"名-值"对中的名字是函数名
-n 把全局变量转换为局部变量
-p 显示全局变量列表
readonly:用于显示或设置只读变量
-- 表明选项结束
-f 创建只读变量
set:设置或重设各种Shell
unset:清除变量
-- 表明选项结束
-f 删除只读变量,但不能取消从Shell环境中删除指定的变量和函数,ex:$PATH
shift n:用于移动位置变量,调整位置变量,n表示向前移动的位数
默认移动一位,即使$3的值赋给$2,$2的值赋给$1
typeset:用于显示或设置变量,同declare
Shell script中的引号
双引号:可引用除字符$、`(反引号)、\外的任意字符或字符串
[root@oracle11g root]# echo -e "hello,$SHELL '\n* ERP-`echo tiptop` *"
hello,/bin/bash '
* ERP-tiptop *
单引号:与双引号类型
但是单引号会忽略所有任何被引号括其来的值,而是将结果作为一个字符串
[root@oracle11g root]# echo -e "hello,$SHELL '\n* ERP-`echo tiptop` *"
hello,$SHELL '\n* ERP-`echo tiptop`
反引号:用于设置系统命令的输出到变量
即将反引号里面的内容作为系统的Shell脚本,并执行其内容
[root@oracle11g root]# echo -e "hello `echo world`"
hello world
反斜杠:屏蔽转义特殊字符含义.ex:&、*、+、^、$、`、? 等
[root@oracle11g root]# echo \* #如果不加\,则表示列示当前路径下所有文件信息
*
Shell script中的运算符
位运算符:~ 取反、<>右移、& 与、| 或、^异或
逻辑运算符:&&逻辑与、||逻辑或、>、==、
赋值运算符:=、+=、-+、*=、/=、%=、&=、^=、|=
Let count+=5
表达式替换:$[ ] 和 $(( )),两个作用相同。表示括号中的表达式求值
$[ ]:可以接受不同基数的数字
[base#n] n表示基数从2到36的任何基数
[root@oracle11g root]# echo $[ 7+8 ] #靠近括号边留空格
15
[root@oracle11g root]# echo $[ 10#8+1 ] #表示8进制的10加1
9