shell学习1

引用: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      =,+=,-=,*=,/=,%=,      赋值,运算且赋值
       &=,^=,|=,<<=,>>=
较高运算级别的运算符先于低级别的运算符进行求值运算


你可能感兴趣的:(shell学习1)