引用:http://blog.csdn.net/xrt95050/article/details/7794408
第一章 SHELL 简介
cat /etc/shells 查看系统中所有的shell
echo $SHELL 查看当前用户运行的shell
程序在shell中运行,shell中可运行子shell
文件类型:
d 目录。
l 链接文件(指向另一个文件),类似于WINDOWS快捷方式。
s 套接字文件。
b 块设备文件。
c 字符设备文件。
p 命名管道文件。
- 普通文件,或者更准确地说,不属于以上几种类型的文件
查看名用法:main chmod或者info chmod
改变文件权限:root用户和文件的拥有者才能够改变文件权限
命令:chmod
chmod u+x,g-r,o+x a
chmod 722 a
chown 改变文件的拥有者
chown 用户名 文件名
chown -R 用户名 文件夹名 可以改变文件夹下所有文件的拥有者
chgrp 改变文件的组
chgrp 组名 文件名
chown root.root 文件夹 -R
umask
设置创建文件或文件夹的默认权限
默认为022,可以通过umask 222设置默认权限
链接
硬连接和软连接
ln [-s] source_path target_path
ln a a_ln 硬链接
ln -s a a_ln 软链接
SHELL
#!/bin/bash
#hello world
printchar="hello world"
echo $printchar
chmod u+x hello.sh
./hello.sh
别名
alias
alias ll='ls -alh'
别名 $HOME/.bashrc文件中
命名替换
myfile的内容
parm
findfile
ls `cat myfile` -al 显示parm findfile文件的信息
把cat myfile命令的结果传递给ls命令
后台处理
nohup command &
nohup tar -czf parm.tar.gz parm &
tar -czf parm.tar.gz parm压缩文件
管道 (|)
把一个命令的输出连接到另一个命令的输入
ls|sort 排序
重定向(< >)
与管道相关,他可以改变程序运行的输入来源和输入来源
sort <myfile.txt 对myfile.txt文件中的内容排序
sort <myfile.txt > myfile_sort.txt 把myfile.txt文件中的内容排序的结果输入到myfile_sort.txt文件中
模式匹配
显示以txt为扩展名的文件或显示以a开头的文件,这种能力就称模式匹配
正则表达式
特殊符号
双引号("):用来使Shell无法认出空格、制表符和其他大多数特殊字符,这样"David Medinets"
表示一个值,而不是2个同样"David < Medinets"表示一个值
单引号('):用来使shell无法认出所有特殊字符
反引号(`):用来替换命令
反斜杠(\):用来使shell无法认出气候的特殊字符,使其后的支付失去了特殊的含义,如David\Medinets
touch David\ Medinets
ls David\ Medinets
分号(;):允许在一行上放多个命令
& :命令后台执行
括号():创建成组的命令
大括号{}:创建命令块
竖杠(|):管道表示符
<>&:表示重定向
*?[]! :表示模式匹配
$:变量名的开头
#:表示注释(第一行除外)
空格、制表符、换行符:当作空白
第二章 变量和运算符
2.1变量
2.1.1本地变量
本地变量在用户现在的shell生命期的脚本中使用
variable_name=vale
set 显示本地所有的变量
readonly variable_name 只读变量
[root@localhost shell]# LOCALTEST="test" #设置本地变量
[root@localhost shell]# echo ${LOCALTEST} #查看本地变量
test
[root@localhost shell]# readonly LOCALTEST #设置本地变量为只读
[root@localhost shell]# LOCALTEST="TEST1" #设置只读的本地变量,提示变量为只读
-bash: LOCALTEST: readonly variable
[root@localhost shell]# readonly #查看当前shell只读的本地变量
2.1.2环境变量
环境变量用于所有用户进程(经常称为子进程)。登录进程为父进程。shell中执行的用户
进程均称为子进程。不像本地变量(只用于现在的shell),环境变量可用于所有子进程,
这包括编辑器、脚本和应用
cat /etc/profile(对所有用户进行设置)或cat $HOME/.bash_profile(对当前用户设置)
export 设置环境变量或者查看环境变量 export user_path="beij"或export
env 查看环境变量 env | grep user_path
2.1.3变量替换
用变量的值替换它的名字
echo
在变量名前加$,使用echo命令可以显示单个变量取值
[root@localhost ~]# testvar="this is a test"
[root@localhost ~]# echo $testvar
this is a test
替换变量
testvar="hxy"
${testvar} 显示实际值
${testvar:+"test"} 如果设置了testvar 则显示其值,否则,为空
${testvar:?"errmsg"} 如果未设置testvar 显示用户定义错误信息errmsg
${testvar:-"test"} 如果未设置testvar 则显示其值test
${testvar :=value} 如果未设置testvar 设置其值,并显示
2.1.4变量清除
unset,readonly 不能unset
unset varable_name
[root@localhost ~]# testvar="this is a test"
[root@localhost ~]# echo $testvar
this is a test
[root@localhost ~]# unset testvar
[root@localhost ~]# echo $testvar
[root@localhost ~]
2.1.5位置变量
位置变量表$0,$1...$9
$0 $1 $2 $3 $4 $5 $6 $7 $8 $9
脚本名称 A B C D E F
向脚本中使用位置参数
parm文件内容如下:
echo "这个脚本的名称:$0"
echo "这是脚本的第1个位置参数:$1"
echo "这是脚本的第2位置参数:$2"
echo "这是脚本的第3个位置参数:$3"
echo "这是脚本的第4个位置参数:$4"
echo "这是脚本的第5个位置参数:$5"
echo "这是脚本的第6个位置参数:$6"
echo "这是脚本的第7个位置参数:$7"
echo "这是脚本的第8个位置参数:$8"
echo "这是脚本的第9个位置参数:$9"
chmod u+x parm
[root@localhost hxy]# ./parm A B C D E
这个脚本的名称:./parm
这是脚本的第1个位置参数:A
这是脚本的第2位置参数:B
这是脚本的第3个位置参数:C
这是脚本的第4个位置参数:D
这是脚本的第5个位置参数:E
这是脚本的第6个位置参数:
这是脚本的第7个位置参数:
这是脚本的第8个位置参数:
这是脚本的第9个位置参数:
向系统命令传递参数
parm.sh 内容如下:
#!/bin/bash
#parm.sh
find /root/shell -name $1 -print
[root@localhost shell]# chmod u+x parm.sh
[root@localhost shell]# ./parm.sh parm
/root/shell/parm
2.1.6标准变量
bash默认建立了一些标准环境变量,可在/etc/profile中定义
set | grep "TERM"或者echo $TERM
EXINIT: 初始化vi的参数
HOME: 主目录
IFS: linux默认的域,字符与字符之间的间隔
LOGNAME: 登录用户名 也可以用set |grep "LOG"命令查看
MAIL: 当前用户邮箱的路径
MAILCHECK: 当前用户有多个邮箱时
TERM:终端的类型
PATH:可执行文件寻找的路径
TZ:表示时区
PS1:登录系统的提示符 [root@localhost shell]#
PS2:
PWD:当前的目录
SHELL:当前用户运行的shell
MANPATH:帮助文档存放的路径
TERMINFO:终端类型配置信息的路径
2.1.7特殊变量
$#(传递到脚本的参数个数)
$*(以一个单字符串表示所有向脚本传递的参数,与位置变量不同,此选项参数可超过9个)
$$(脚本运行的当前进程ID号)
$!(后台运行的最后一个进程的进程ID号)
$@(与$*相同,但是使用时加引号,并在引号中返回每个参数)
$-(表示shell使用的当前选项,与set命令功能相同)
$?(显示最后命令的退出状态,0表示没有错误,其他值表面有错误)
[root@localhost shell]# vi parm
echo "这个脚本的名称:$0"
echo "这是脚本的第1个位置参数:$1"
echo "这是脚本的第2位置参数:$2"
echo "这是脚本的第3个位置参数:$3"
echo "这是脚本的第4个位置参数:$4"
echo "这是脚本的第5个位置参数:$5"
echo "这是脚本的第6个位置参数:$6"
echo "这是脚本的第7个位置参数:$7"
echo "这是脚本的第8个位置参数:$8"
echo "这是脚本的第9个位置参数:$9"
echo "显示参数个数:$#"
echo "显示脚本全部参数:$*"
echo "显示进程ID:$$"
echo "显示前一命令运行后状态:$?"
[root@localhost shell]# ./parm A B C D E
这个脚本的名称:./parm
这是脚本的第1个位置参数:A
这是脚本的第2位置参数:B
这是脚本的第3个位置参数:C
这是脚本的第4个位置参数:D
这是脚本的第5个位置参数:E
这是脚本的第6个位置参数:
这是脚本的第7个位置参数:
这是脚本的第8个位置参数:
这是脚本的第9个位置参数:
显示参数个数:5
显示脚本全部参数:A B C D E
显示进程ID:2776
显示前一命令运行后状态:0
2.1.8影响变量的命名
declare
- 设置或显示变量
- -f只显示函数名
- -r创建只读变量(declare和typeset)
- -x创建转出变量
- -i创建整数变量
- 使用+替代-,可以颠倒选项的含义
export
用于创建传给子shell的变量
- --表明选项结束,所有后续参数都是实参
- -f表明在“名-值”对中的名字是函数名
- -n把全局变量转换成局部变量。换句话说,命令的变量不再传给shell
- -p显示全局变量列表
readonly
- 用于显示或设置只读变量
- --表明选项结束
- -f创建只读变量
set
- 设置或重设各种shell
unset
- 用于取消变量的定义
- --表明选项结束
- -f删除只读变量,但不能取消从shell环境中删除指定的变量和函数。
如PATH,PS1,PS2,PPID,UID,EUID等的设置
shift[n] n移动的个数
- 用于移动位置变量,调整位置变量,使$3的值赋予$2,使$2的值赋予$1
typeset
- 用于显示或设置变量
- 是declare的同义词
2.2引号
2.2.1引号的必要性
变量和替换操作,在脚本中执行变量替换时最容易犯的一个错误就是引用错误
2.2.2双引号
使用双引号可引用除字符$、`、\外的任意字符或字符串
ehco -e "ert,$SHELL '\n*china`echo itlab` "
ert,/bin/bash
*chinaitlab
2.2.3单引号
单引号与双引号类型,不同的是shell会忽略任何引用值。换句话说,如果屏蔽了
其特殊含义,会将引号里的所以字符,包括引号都作为一个字符串
ehco -e 'ert,$SHELL '\n*china`echo itlab` '
ert,$SHELL '\n*china`echo itlab`
2.2.4
反引号
反引号用于设置系统命令的输出到变量。shell将反引号中的内容作用一个系统命令,
并执行其结果
[root@localhost shell]# echo "* china`echo itlab`"
* chinaitlab
2.2.5
反斜杠
如果一个字符有特殊含义,反斜杠防止shell误解其含义,即屏蔽其特殊含义
下面字符包含有特殊意义,& * + ^ $ ` " | ?
[root@localhost shell]# echo *
David Medinets hello.sh myfile myfile.txt parm parm.sh sort
You have new mail in /var/spool/mail/root
[root@localhost shell]# echo \*
*
2.3运算符
运算符是对计算机发的指令
运算对象:数字、字符(字面值);变量;表达式
表达式:运算符和运算对象的组合体
2.3.1运算符类型
按位运算
~,<<,>>,$,|,^
$[ ]表示形式告诉shell对方括号中的表达式求值
$[2+8]
运算符 说明
~op1 反运算符,把op1中所有的二进制为1的变为0,0变为1
op1<<op2 左移运算符,把op1中的二进制位向左移动op2位,忽略最左端移出的各位
,最右段的各位补上0值,每做一处按位左移就实现op1乘以2
op1>>op2 右移运算符,把op1中的二进制位向右移动op2位,忽略最右端移出的各位
,最左段的各位补上0值,每做一处按位右移就实现op1除以2
op1&op2 与比较运算符,op1和op2对应位,对于每个二进制位来说,如果二者该位
都是1,则结果为1,否则结果为0
op1^op2 异或运算符,比较op1和op2对应位,对于每个二进制位来说,如果二者该位
互补,则结果为1,否则结果为0
op1|op2 或运算符,op1和op2对应位,对于每个二进制位来说,如果二者该位
有一个1或者都是1,则结果为1,否则结果为0
逻辑运算符
运算符 说明
&& 与运算符
|| 或运算符
>,==,<,!= 大于,等于,小于,不等于运算符
赋值运算符
=,+=,-=,*=,/=,%=,$=,^=,|=,<<=,>>=
let count=$count+$change
let count+=$change
2.3.2表达式替换
$[]和$(())
习惯使用$[],所有shell的求值都是用整数完成
$[]可以接受不同基数的数字
[base#n] n表示基数从2到36的任何基数,表示进制
echo $[10#8+1]
9
运算符的优先级(用括号来改变运算顺序)
级别 运算符 说明
13 -,+ 正,负
12 !,~ 逻辑或,按位取反或补码
11 *,/,% 乘,除,取摸
10 +,-, 加,减
9 <<,>> 按位左移,按位右移
8 <=,>=,<,> 小于等于,大于等于,小于,大于
7 ==,!= 等于,不等于
6 & 按位与
5 ^ 按位异或
4 | 按位或
3 && 按位与
2 || 按位或
1 =,+=,-=,*=,/=,%=, 赋值,运算且赋值
&=,^=,|=,<<=,>>=
较高运算级别的运算符先于低级别的运算符进行求值运算