Bash shell学习笔记.docx

上传人:b****8 文档编号:11335570 上传时间:2023-02-27 格式:DOCX 页数:62 大小:55.77KB
下载 相关 举报
Bash shell学习笔记.docx_第1页
第1页 / 共62页
Bash shell学习笔记.docx_第2页
第2页 / 共62页
Bash shell学习笔记.docx_第3页
第3页 / 共62页
Bash shell学习笔记.docx_第4页
第4页 / 共62页
Bash shell学习笔记.docx_第5页
第5页 / 共62页
点击查看更多>>
下载资源
资源描述

Bash shell学习笔记.docx

《Bash shell学习笔记.docx》由会员分享,可在线阅读,更多相关《Bash shell学习笔记.docx(62页珍藏版)》请在冰豆网上搜索。

Bash shell学习笔记.docx

Bashshell学习笔记

Linuxshell

#!

/bin/sh#使用/bin和/sh来执行程序

a="helloworld"#对变量赋值,等号两边无空格,如都有空格则为相等操作

echo"Ais:

"#输出字符串"Ais"

echo$a#输出变量a的内容,$用于取出变量值

在编辑器中将以上命令行保存为一个名为first的文件,接着输入

chmodu+xfirst#chmod+x使脚本文件是可执行的权限,后跟文件名

./first#./执行脚本文件,后跟文件名./表示当前路径

有时变量名与其他文字易混淆,如

num=2

echo"thisisthe$numnd"这样会打印出thisisthe,直接改为

echo"thisisthe$nd"这样就会正常

unset语句用于清除变量的值

set查看当前shell中所有的本地变量

env查看当前shell中的环境变量

readonly用于将变量设置为只读属性,之后就不能再改变其值

shell中的变量是整型或者字符串型,如果是字符串型时,它还有个隐藏的整型变量,为0

标准变量

EXINIT存放了VI或VIM启动时的一些参数

HOME当前用户的主目录

IFS当前系统使用的分隔符,默认是空格

LOGNAME显示当前的用户的登录名

MAIL当前用户的邮箱的路径

MAILCHECK定义了检查邮箱的频率

PATH存储了可执行文件的路径

pwd显示当前系统的完整路径

在vim的编辑状态下输入setnu即可显示行号

Shell语言中给一个变量赋值,实际上就是定义了变量,除了一般的仅在程序内有效的shell变量外,还有环境变量,由export关键字声明的变量叫做环境变量,时从父进程中继承而来的变量,通常仅在登陆脚本中使用环境变量,故暂不讨论。

filesomefile得到文件类型

readvar提示用户输入,并将输入赋值给变量

sortfile.txt对file这个txt文件中的行进行排序

expr进行数学运算,如expr2"+"3

实现数值变量增加20后再赋给这个变量

a=`expr$a+20`

find命令一个查找命令,查找具有某些特征文件的命令,可遍历当前目录甚至整个文件系统来查找某些文件或目录。

缺点就是遍历大的文件系统时,一般放在后台来执行。

一般格式为:

findpathname-option[-print-exec-ok]

pathname路径名称,当前路径./,根目录用/,如未写出,默认为当前路径

print将匹配的文件输出到标准输出

exec对匹配的文件执行该参数所给出的shell命令,命令末尾必须以空格{}空格\;来结束语句

ok与exec的作用相同,不过更安全,因为在执行前,都会提示用户选择是否执行

option有以下几种:

-name按文件名来查找

-perm按文件权限来查找

-user按文件属住来查找

-group按照文件所属的组来查找

-mtime-n|+n按文件的更改时间来查找,+n代表修改时间在n天前的,-n代表修改时间在n天内的

-atime-n|+n存取或变更时间在n小时之内或之外的

-amin-n|+n存取或变更时间在n分钟之内或之外的

-sizen|c查找文件长度为n块的文件,带c表示文件长度以字节计算

-nogroup查找没有有效所属组的文件,即文件所属的组在/etc/grpups中不存在

-nouser查找无有效属主的文件,即文件的属主在/etc/passwd中不存在

-type查找某一类型的文件,如b块设备文件,d目录,c字符设备文件,p管道设备,l符号链接,f普通文件

例如:

find-name"*.txt"-print查找当前路径下文件名任意,以txt结尾的文件并打印到标准输出

find./-name"*.txt"-print同上,查找当前路径下文件名任意,以txt结尾的文件并打印到

标准输出

find./-name"[A-Z]*"-print查找当前目录下文件名以大写字母开头的文件并打印

find.-perm755-print查找当前目录下执行权限为755的文件

find`pwd`-userroot-print查找当前目录下属主为root的文件并打印出来

find`pwd`-nouser-print查找当前目录下没有属主的文件并打印出来

find./-grouproot-print查找当前所属主为root的文件并打印出来

find./-nogroup-print查找没有所属组的文件

find./-mtime+5-print查找当前目录下修改时间在5天之前的文件

find./-mtime-5-print查找当前目录下修改时间在5天以内的文件

find/etc-typed-print查找etc目录下文件类型为目录的文件并打印出来

find/etc-typed-print查找etc目录下文件类型为超链接的文件并打印出来

find./-size+1000c-print查找当前目录下字节数大于1000b的文件

find./-size+10-print查找当前目录下分成10块的文件

find/etc"*.txt"-depth-print先查找当前目录下再查找子目录下以txt文件结尾的文件

find./-typef-execls-l{}\;查找当前目录下的文件然后用ls命令显示出来,结尾处的{}\是必须的,且要注意空格

find./-name"*.log"-mtime+5-okrm{}\;查找当前目录下5天前的log文件并提示是否删

find./-perm-7-print|xargschmodo-wxargs比exce命令占用的资源更少,因为只会发

起一个进程,但执行的效果与exec相同

Shell中的输入与输出

我们知道,执行一个shell命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),

通常对应终端的键盘;标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件都对应终端的屏幕。

进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。

以上三种分别用0,1,2来表示。

但以上方式的弊端是处理不灵活,只能显示,而不能做更多的处理,如将输出作为另一命令的输入,由此引入了输入和输出的重定向和管道。

cathter.txt1>account.out2>ere.err

1代表将标准输出输出不到account.out这个文件

2代表将标准错误输出输出到err.err这个文件

grep"standard"standard.txt>grep.out2>&1将标准和错误输出到grep.out这个文件

概念:

管道,重定向和backtick,这些不是系统命令,但很重要

管道(|)将一个命令的输出作为另外一个命令的输入,或理解为连接两条命令,如

grep"hello"file.txt|wc-l就file的txt文件中搜索hello的字符串后并计算其行数

输入重定向

是指把命令的标准输入重定向到指定的文件中,即输入可以不来自键盘,而来自某个特定的文件,故主要用于改变一个命令的输入源,特别是需要大量输入的输入源。

如果给出一个文件名作为wc命令的参数,如下例所示,wc将返回该文件所包含的行数、单词数和字符数。

$wc/etc/passwd

另一种把/etc/passwd文件内容传给wc命令的方法是重定向wc的输入。

输入重定向的一般形式为:

命令<文件名。

可以用下面的命令把wc命令的输入重定向为/etc/passwd文件:

$wc

由于大多数命令都以参数的形式在命令行上指定输入文件的文件名,所以输入重定向并不经常使用。

尽管如此,当要使用一个不接受文件名作为输入参数的命令,而需要的输入内容又存在一个文件里时,就能用输入重定向解决问题。

输出重定向

是指把命令(或可执行程序)的标准输出或标准错误输出重新定向到指定文件中。

这样,该命令的输出就不显示在屏幕上,而是写入到指定文件中。

输出重定向比输入重定向更常用,很多情况下都可以使用这种功能。

例如,如果某个命令的输出很多,在屏幕上不能完全显示,那么将输出重定向到一个文件中,然后再用文本编辑器打开这个文件,就可以查看输出信息;如果想保存一个命令的输出,也可以使用这种方法。

还有,输出重定向可以用于把一个命令的输出当作另一个命令的输入输出重定向的一般形式为:

命令>文件名。

例如:

$ls>directory.out

$catdirectory.out

ch1.docch2.docch3.docchimpconfigmail/test/

将ls命令的输出保存为一个名为directory.out的文件。

注:

如果>符号后边的文件已存在,那么这个文件将被重写。

为避免输出重定向中指定文件只能存放当前命令的输出重定向的内容,shell提供了输出重定向的一种追加手段。

输出追加重定向与输出重定向的功能非常相似,区别仅在于输出追加重定向的功能是把命令(或可执行程序)的输出结果追加到指定文件的最后,而该文件原有内容不被破坏。

如果要将一条命令的输出结果追加到指定文件的后面,可以使用追加重定向操作符>>。

形式为:

命令>>文件名。

例如:

$ls*.doc>>directory.out

Shell参数,主要分为位置变量和内部变量

1)位置变量,其值可以用$N得到,N为数字,如为1,即$1,类似C中的数组,Linux会把输入的命令串分段并标号,从0开始,0为程序名字,从1开始表示传递给程序的变量。

如$0表示程序的名字,$1表示传递给程序的第一个参数,以此类推。

2)内部变量上述过程中$0是一个内部变量,是必须的,$1则可有可无,与$0一样的内部变量还有

$#传递给程序总的参数数目

$?

上一个代码或者shell程序在shell中退出的情况,正常则返回0,反之则非0

$*传递给程序的所有参数组成的字符串

如:

建立一个名字为P1的如下程序(此处默认的上级路径为/home/beichen/bin)

echo"programnameis$0"

echo"Therearetotally$#parameterspassedtothisprogram"

echo"Thelastis$?

"

echo"Theparametersare$*"

执行后结果如下

[beichen@localhostbin]$P1thisisatestprogram//传递了5个参数

Programnameis/home/beichen/bin/P1//给出程序的完整路径和名字

Therearetotally5parameterspassedtothisprogram//显示参数的总数

Thelastis0//显示上一次的程序执行结果正常

Theparametersarethisisatestprogram//返回所有参数组成的字符串

接下来用内部变量和位置参数编写一个名为del的简单删除程序

#name:

del

#thisprogramistocompressafiletothedustbin

iftest$#-eq0

then

echo"Pleasespecifyafile!

"

else

gzip$1//对文件进行压缩

mv$1.gz$HOME/dustbin//移动到回收站

echo"File$1isdeleted!

"

{}用这个来获取变量值的长度,如echo${#var}

test命令,用于计算一个条件表达式的值,经常用于在条件语句和循环语句中来判断某些条件是否满足。

也可以使用[expression]来启动判断命令,经常与if、while等连用,表达式与两端的[]有空格。

shell的内部判断操作符,如下:

1、字符串比较运算符

str1=str2比较两个字符串是否相同,同则返回true

str1!

=str2比较两个字符串是否相同,不同则返回true

-nstr比较字符串长度是否大于零,大于则返回true

-zstr比较字符串长度是否等于零,等于则返回true

str测试字符串是否为空,不是返回true,只能使用test命令,如test"$string"

2、整数比较运算符,与字符串操作符类似,但只针对整数

int1-eqint2int1等于int2时返回true

int1-geint2int1大于等于int2时返回true

int1-leint2int1小于等于int2时返回true

int1-neint2int1不等于int2时返回true

int1-gtint2int1大于int2时返回true

int1-ltint2int1小于int2时返回true

3、逻辑操作符

!

expr当expr的值为false时,返回true

expr1-aexpr2当expr1和expr2都为true时,返回true逻辑与(a=and)

expr1-oexpr2当expr1和expr2任一的值为true时,返回true逻辑或(o=or)

4、文件操作符

通常为了测试文件的信息,一般由脚本来决定文件是否应备份、复制或删除

-dfile当file是一个目录时,返回True

-ffile当file是一个普通文件时,返回True

-sfile当file文件长度大于0时,返回True

-rfile当file是一个可读文件时,返回Truetest-rfile

-wfile当file是一个可写文件时,返回True

-xfile当file是一个可执行文件时,返回True

-efile当file存在时,返回true

-lfile当file为符号化链接时,返回true

5、自增自减运算符

主要包括前置自增:

++var,前置自减:

--var,后置自增:

var++和后置自减var--

前置操作首先改变变量的值,然后再将改变的变量值交给表达式使用

后置操作则是在表达式使用后再改变变量的值

这类运算符只能用于整数型的变量,其他的都是不合法的。

6、数字常量

Linuxshell标本或命令默认将数字以十进制的方式进行处理,如果要用其他进制的方式进行处理,则需要对这个进行特定的标记或加前缀

零0作为前缀表示8进制

0x为前缀表示16进制

make命令,是一个被用来编译大程序的程序,以其他跟的参数作为目标来进行编译。

shell中的特殊字符

1、通配符,用于模式匹配,如文件名匹配,路径名搜索,字符串查找等,常见的有*,?

[]

1)*代表任何字符串,长度可以不等,但文件名中前的圆点和斜线必须显式匹配,如".*"才能匹配.file

2)?

代表任何单个字符

2、引号

在shell中引号分为三种:

单引号,双引号和反引号。

1)单引号',用这个括起来的字符都以普通字符出现,特殊字符也如此,被作为普通字符来解释

2)双引号",由双引号括起来的字符,除$、’、和\这几个字符仍是特殊字符并保留其特殊功能外,其余字符仍作为普通字符对待

3)反引号`,这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(’)混淆。

反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分

3、别名

还有一个使工作变得轻松的方法是使用命令别名。

命令别名通常是其他命令的缩写,用来减少键盘输入。

命令格式为:

alias[alias-name=’original-command’]

其中,alias-name是用户给命令取的别名,original-command是原来的命令和参数。

需要注意的是,由于Bash是以空格或者回车来识别原来的命令的,所以如果不使用引号就可能导致Bash只截取第一个字,从而出现错误。

如果alias命令后面不使用任何参数,则显示当前正在使用的被别名化的命令及其别名。

为命令取的别名在该次登录期间始终有效。

如果用户需要别名在每次登录时都有效,那么就将alias命令写到初始化脚本文件中。

如aliaslm='ls-al'就是用lm这个指令来代替'ls-al'这个命令

例]如果经常要键入如下的命令,最好为它建立一个别名来减少工作量。

$cd/usr/X11/lib/X11

假如为这个长命令建立一个名为goconfig的别名,在Bash提示符下键入如下命令:

$aliasgoconfig=’cd/usr/X11/lib/X11’

现在,除非您退出Bash,键入goconfig将和原来的长命令有同样的作用。

如果想取消别名,可以使用下面的命令:

$unaliasgoconfig

提示符

Bash有两级提示符。

第一级提示符是经常见到的Bash在等待命令输入时的情况。

第一级提示符的

默认值是$符号。

如果用户不喜欢这个符号,或者愿意自己定义提示符,只需修改PS1变量的值。

例如将其改为:

PS1=”Enteracommand:

第二级提示符是当Bash为执行某条命令需要用户输入更多信息时显示的。

第二级提示符默认为>。

如果需要自己定义该提示符,只需改变PS2变量的值。

例如将其改为:

PS2=”Moreinformation:

子shell与export命令

用户登录到Linux系统后,系统将启动一个用户shell。

在这个shell中,可以使用shell命令或声明变量,也可以创建并运行shell脚本程序。

运行shell脚本程序时,系统将创建一个子shell。

此时,系统中将有两个shell,一个是登录时系统启动的shell,另一个是系统为运行脚本程序创建的shell。

当一个脚本程序运行完毕,它的脚本shell将终止,可以返回到执行该脚本之前的shell。

从这种意义上来说,用户可以有许多shell,每个shell都是由某个shell(称为父shell)派生的。

在子shell中定义的变量只在该子shell内有效。

如果在一个shell脚本程序中定义了一个变量,当该脚本程序运行时,这个定义的变量只是该脚本程序内的一个局部变量,其他的shell不能引用它,要使某个变量的值可以在其他shell中被改变,可以使用export命令对已定义的变量进行输出。

export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝。

这个过程称之为变量输出。

touchfileA如果fileA存在,使用touch指令可更改这个文件或目录的日期时间,包括存取时间和更改时间;如果fileA不存在,touch指令会在当前目录下新建一个空白文件fileA。

常见的环境变量

PWD记录当前的目录路径,当用cd命令改变当前目录时,PWD自动更新

OLDPWD记录旧的工作目录,及用户所处的前一个目录

PATH记录一系列目录列表,shell为每个输入命令搜索PATH中的目录列表,一旦该命令在目录列表中,则代表可以执行,否则就不能执行

HOME记录当前用户的根目录,每个用户都有一个HOME目录

SHELL保存目前缺省的SHELL

USER保存已登录用户的名字

UID保存已登录用户的ID,超级用户root的UID是0

PPID创建当前进程的进程号,即当前进程的父进程号

PS1和PS2提示符变量,用于设置提示符格式,PS1是一级Shell提示符的环境变量,也成为主提示符字符串。

总共有四级提示符变量。

PS1默认的变量有[\u@\h\w]\$,\u表示当前用户名,\h表示主机名,\w表示当前目录名。

如果是root用户,则显示为\#,如是其他用户,则表示为\$。

一级提示符默认显示这些项,可以根据需要进行修改,如PS1="[\u\@\H\w\#]\$"

PS2用于设置二级shell提示符的环境变量,若命令未输入完整,按enter键则在第二行出现二级提示符。

PS2="XX00"更改二级提示符为XXOO

linux系统中以.开头的文件都是隐藏文件,用ls命令不能查看,而是要用ls-a才能查看

环境变量中的重要的配置文件:

1)$HOME/.bash_profile当某用户登录时,shell会自动执行.bash_profile,如不存在,则会自动

执行系统默认的配置文件/etc/profile。

cat.bash_profile这个文件后,前面的9行(含空格)都是系统默认的,export开头的就是用户自行设置的系统变量。

更改此文件后,需要使用到source命令或者.命令,重新执行刚刚修改的初始化文件,使其生效,而不必注销并重新登录,如..bash_profile,两个.之间有空格

位置参数是一种特殊的shell变量,用于从命令行向shell脚本传递参数。

$0表示了脚本本身的名字,$1表示第一个参数,从第10个参数开始,使用大括号,如${20}。

特殊的位置参数有:

$#传递到脚本的参数数量

$*传递到脚本的所有参数

$@同上

$$脚本运行的进程号

$?

命令的退出状态,0表示没有错误,非0表示有错误

引用是指将字符串用引用符号括起来,以防止特殊字符被shell脚本重新解释为其他意义,特殊字符是指除了字面意思之外还可以解释为其他意思的字符。

双引号""除了美元符号$,反引号`,反斜线\外,其他所有的符号在双引号中均没有特殊含义,还能够防止字符串的分割,保留变量中的空格

单引号引用了所有字符,即单引号中字符除了其本身外都解释为字面意义,其不再具备引用变量的功能。

通常将单引号的引用方式成为全引用,将双引号的引用方式成为部分引用。

反引号`(键盘esc下面的那个键)叫做命令替换,用法与$()相同,在执行一条命令时,会先将``中的语句当做命令执行一遍,再将结果加入到原命令中重新执行。

如echo`ls`会先执行ls命令,得到的所有文件名再用echo以一般字符串显示出来。

转义符反斜线\将后面的字符的特殊含义屏蔽,用字面意思去解析它。

反斜线与字符形成新的符号\n换行

\r返回\ttab键\b退格键

&加在命令后面,则该命令在后台执行,使用jobs命令显示当前在后台运行的指令

$?

用于查看上一个程序的退出状态,正常退出则返回0。

如通过ls未查询到匹配的文件,则$?

返回

2。

如果是未知命令,则返回127。

控制流结构

if语句结构为

ifexpression

then

command

command

else

command

command

fi

如果expression后没有分号;,则then要换行,否则会出错。

当嵌套的语句太多时,可以使用if/elif/else的语句

ifexpression1

then

command

command

elifexpression2

then

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1