天天看点

Linux 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 ~]# unset 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 内容如下:

#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 "显示参数个数:$#"

echo "显示脚本全部参数:$*"

echo "显示进程ID:$$"

echo "显示前一命令运行后状态:$?"

[root@localhost shell]# ./parm A B C D E

显示参数个数: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