linux+shell编程 笔记 1

来源:互联网 发布:淘宝安装师傅在哪接单 编辑:程序博客网 时间:2024/06/07 07:55

1、变量

被双引号("")括起来的变量替换是不会被阻止的,所以双引号被称为部分引用,或弱引用;被单引号('')括起来的变量替换是被禁止的,变量名只会被解释成字面上的意思,不会发生变量替换,所单引号被称为全引用,或强引用。

linux中有两种变量类型:全局变量和局部变量。特别需要注意一点的是,局部变量的申明前面必选加上local,否则即使在代码块中,也是全局可见的。环境变量就是全局变量。

 

2、shell进程的环境变量

每个进程都有自己运行的环境,这些环境是由一组变量组成的,这些变量中存有进程可能需要引用的信息。

每次当一个shell启动时,都会创建适合于自己环境变量的shell变量。更新或者添加一个新的环境变量,当前shell都会立刻更新它自己的环境,即更改都会立即生效,并且所有后继生成的shell子进程都会继承这个环境。

如果脚本要设置一个环境变量,需要将这些变量“export”出来,也就是需要通知到脚本本地的环境。一个脚本只能够export变量到这个脚本所产生的子进程中,也就是只能够对这个脚本所产生的命令和进程起作用。子进程不能够export变量来影响父进程的环境。

export [-fnp][变量名称]=[变量设置值]

-f :代表[变量名称]中为函数名称。

-n:删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。

-p:列出所有的shell赋予程序的环境变量。

export命令修改当前shell进程的环境变量,若将export命令置于脚本中被执行,export命令对父shell进程的环境变量没有影响。export可新增、修改或删除环境变量,供后续执行的程序使用,export的效力仅作用于登录操作。

export命令用于设置当前进程的环境变量,但是有效期是进程活动的时间,进程消亡即没有作用。如果想把环境变量的设置永久保存,则可以将export命令置于shell登录时执行的启动文件中。

启动文件包含别名和环境变量,正是这些别名和环境变量才使得shell可以作为一个用户shell来运行。

 

3、shell的变量分类:

在Shell中有三种变量:内部变量,环境变量,用户变量
    内部变量:系统提供,不用定义,不能修改
    环境变量:系统提供,不用定义,可以修改,可以利用export将用户变量转为环境变量.
    用户变量:用户定义,可以修改
(1)内部变量(系统变量,环境变量,参数变量,预定义变量)
     内部变量是Linux所提供的一种特殊类型的变量,这类变量在程序中用来作出判断。在shell程序内这类变量的值是不能修改的。
           表示方法                                  描述
                $n                $1 表示第一个参数,$2 表示第二个参数 ...
                $#                            命令行参数的个数
                $0                              当前程序的名称
                $?                      前一个命令或函数的返回码
                $*                以"参数1 参数2 ... " 形式保存所有参数
                $@           以"参数1" "参数2" ... 形式保存所有参数
                $$                      本程序的(进程ID号)PID
(2) 环境变量
      Linux环境(也称为shell环境)由许多变量及这些变量的值组成,由这些变量和变量的值决定环境外观。这些变量就是环境变量。
     包括两部分,一是,由系统设置的,主要包括: HOME,LOGNAME,MAIL,PATH,PS1,PWD,SHELL,TERM
                          二是,用户在命令行中设置的,使用export命令,但是用户注销时值将丢失
(3)用户变量(私有变量,本地变量)
     在命令行中自己设定的.

 

4、管道和重定向

从标准输入读入,从标准输出输出,将异常和错误报告到标准错误。这是linux的软件行为规则,但是我们也需要改变默认的输入端和输出端。

(1)以>(1>或2>)改变标准输出:形如command>file,将command的标准输出重定向到文件或其他地方,而不是直接打印到控制台上。

(2)以<改变标准输入:形如command<file,将command的标准输入修改成文件或者其他,而不单单是控制台。

(3)以>>(1>>或2>>)追加文件:形如command>>file,将command的输出追加到文件file的尾部。

(4)以<<结束输入:形如command<<eof,知道输入为eof时,结束输入。

(5)以|建立管道:command1|command2,将command1的标准输出与command2的标准输入相连。

管道的数据共享是通过内存拷贝实现的,相对来说比较耗费时间,因此,在设计管道时,要尽量把能够减少数据量的操作置于管道的前端,一来减少数据拷贝快速,而来程序运算量减少。

 

5、文件描述符:内核利用文件描述符来访问文件,文件描述符是非负整数,打开现存文件和新建文件,内核都会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。

文件描述符表:

6、特殊文件

1)/dev/null:非常接近于一个只写文件,所有写入它的内容都会永远丢失,从它那里也读不出任何东西。

使用:如果将标准输出和错误重定向到null,则可以让终端不显示信息;可以在保存文件权限不变的情况下清空文件内容。

2)/dev/zero:主要用途是用来创建一个指定长度、并且初始化为空的文件,因为zero是产生一个null流,这种文件一般作为临时交换文件。

3)/dev/tty:当程序打开这个文件时,系统会重定向到当前所处的终端,输出到此的信息只会显示在当前工作的终端显示器上。

在某些时候,想在当前终端上显示一些很重要的信息,就可以调用这个设备,写入重要的信息,这样做可以强制信息显示到终端。

 

7、stty:用于显示和修改终端行设置。

stty不带参数可以打印终端行设置,加上-a可以打印更详细的信息;

stty size可以显示终端的大小,即行数和列数;

stty还可以更改终端行的设置,格式:stty SETTING char

STTEING可以是如下内容:

    eof : 输入结束,文件结束,默认为Ctrl+D。比如:用cat >file来创建文件时,按Ctrl+D来结束输入。
    erase : 向后删除字符,擦除最后一个输入字符,默认为Ctrl+?。注意默认情况下退格键Backspace不是删除字符。
    intr : 中断当前程序,默认为Ctrl+C。
    kill : 删除整条命令,删除整行,默认为Ctrl+U。
    quit :退出当前程序,默认为Ctrl+\或Ctrl+|。
    start : 启动屏幕输出,默认为Ctrl+Q。
    stop :停止屏幕输出,默认为Ctrl+S。有时候终端突然僵死了,可能是不小心按了Ctrl+S的缘故,因为我们习惯性的按Ctrl+S来保存文件。
    susp : terminal stop当前程序,默认为Ctrl+Z。这样当前进程就会变成后台进程了。    
    werase:删除最后一个单词,默认为Ctrl+W。 

stty -echo:关闭回显  ; stty echo:打开回显

stty iuclc:禁止输出大写 ; stty -iuclc:恢复,可以输出大写

stty olcuc:禁止输出小写 ; stty -olcuc:恢复,可以输出小写

stty igncr:忽略回车符 ; stty -igncr:恢复,不会略回车符

 

8、read命令:read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量,用 IFS(内部字段分隔符)变量中的字符作为分隔符。VariableName 参数指定 shell 变量的名称,shell 变量获取输入行一个字段的值。由VariableName 参数指定的第一个 shell 变量指定给每一个字段的值,由 VariableName 参数指定的第二个 shell 变量指定给第二个字段的值,以此类推,直到最后一个字段。如果标准输入行的字段比相应的由 VariableName 参数指定的 shell 变量的个数多,把全部余下的字段的值赋给指定的最后的 shell 变量。如果比 shell 变量的个数少,则剩余的 shell 变量被设置为空字符串。

如果省略了参数名,变量REPLY(环境变量)用作缺省的变量名。

-p:允许在read命令行中直接指定一个提示;

-t:指定一个计时器;

-n*:指定输入的字符,*为字符个数;

-s:默读,不希望输入的数据显示在监视器上(实际上,数据是显示的,只是read命令将文本颜色设置成与背景相同的颜色)。

 

9、常见的linux文件类型:普通文件、目录、字符设备文件、块设备文件、符号链接文件等。

1)普通文件:第一个符号位-,这些文件一般是用一些相关的应用程序创建。又可详细分为:纯文本文件、二进制文件、数据格式文件。

2)目录:第一个符号位d

3)字符设备或块设备文件:第一个字符是c是字符设备文件;第一个字符是b是块设备文件。可以通过mknod来创建,用rm删除。

4)套接口文件:第一个符号位s

5)符号链接文件:第一个符号位l,通过命令“ln -s 源文件(夹)名 新文件(夹)名”建立。链接文件如同win下的快捷方式。

ln的功能就是为一个文件在另一个位置建立一个链接,当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。

-s是代号的意思,这里有两点需要注意:a)ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;b)ln的链接有软链接和硬链接两种,软链接就是ln –s ** **,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。

 

10、字符串操作符:大括号({:命令开始块;}:命令结束块)允许我们使用shell字符串操作的更多高级功能,即字符串处理运算符。字符串处理运算可以确保变量存在且有值;设置变量的默认值;捕获未设置的变量而导致的错误;删除匹配模式的变量的值部分内容。

替换运算符:

1)${varname:-word}:如果varname存在且非null,则返回varname的值;否则返回word。用途在于如果变量未定义,有默认的值;

2)${varname:=word}:如果varname存在且非null,则返回varname的值;否则将varname的值设置为word。【与上面的区别在于下面把值赋给了varname,上面则没有赋值,而是直接返回默认值】

3)${varname:?message}:如果varname存在且非null,则返回varname的值;否则直接打印message,并退出当前脚本。用于捕捉由于变量为定义而导致的错误。

4)${varname:+word}:如果varname存在且非null,则返回word;否则返回null。用于测试变量是否存在。

上面的表达式,如果去掉冒号,则是将每个定义中的“存在且非null”改成“存在”,即只判断变量是否存在。

模式匹配运算符:

1)${varname#pattern}:如果模式匹配是在开始处匹配,则删除匹配的最短部分,并返回剩下的部分;

2)${varname##pattern}:如果模式匹配是在开始处匹配,则删除匹配的最长部分,并返回剩下的部分;

3)${varname%pattern}:如果模式匹配是在结尾处匹配,则删除匹配的最短部分,并返回剩下的部分;

4)${varname%%pattern}:如果模式匹配是在结尾处匹配,则删除匹配的最长部分,并返回剩下的部分;

5)${varname/pattern/string} | ${varname//pattern/string}:将varname中匹配模式最长的部分替换为string的内容。第一个格式,只有匹配的第一部分被替换;第二种格式,所有匹配的部分都被替换。

如果pattern以#开头,则必须匹配varname的开头;如果pattern以%开头,则必须匹配varname的结尾。如果string为空,匹配部分被删除。

echo -e ${PATH//:/'\n'}   -e  标注把特殊字符 加以处理后显示,而不是将它当成一般字符串显示出来。如这里就解析\n为换行。

== 

echo $PATH | sed 's/:/\n/g'
补充:1)  ${#varname}:返回varname字符串中的字符个数。

            2)  有两个相对重要的模式,一个而是/*/,表示匹配斜线和之间的内容;另一个是.*,表示匹配点号和后面的内容。


11、位置变量:也称系统变量、位置参数,是shell脚本运行时传递给脚本的参数,同时也表示在shell函数内部的函数参数。

12、启动文件:shell使用一些启动文件来协助创建一个运行环境,/etc目录下的文件提供全局设置,如果用户目录下存在同名文件,将覆盖全局设置。

etc/environment 和 etc/profile:对于用户的shell,初始化时先执行etc/profile,再读取etc/environment;而对整个系统而言是先执行etc/environment。

etc/profile 是所有用户的环境变量;etc/environment是系统的环境变量。

登陆系统时shell读取的顺序是:/etc/profile ->/etc/enviroment -->$HOME/.profile -->$HOME/.env

同一个变量在用户环境(/etc/profile)和系统环境(/etc/environment)有不同的值那应该是以用户环境为准了。

1)/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的http://write.blog.csdn.net/postedit/8900235配置文件中搜集shell的设置。
2)/etc/bashrc::为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。
3)~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
4)~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
5) ~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件. 另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承 /etc/profile中的变量,他们是"父子"关系。
6)~/.bash_profile: 是交互式login 方式进入 bash 运行的;~/.bashrc 是交互式 non-login 方式进入 bash 运行的。通常二者设置大致相同,所以通常前者会调用后者。

 etc/environment设置诸如最小搜索路径、时区、语言等用户环境。这是个类似配置文件的数据格式:name=<value>;


13、ps命令

ps命令可以确定有哪些进程在运行和运行地状态、进程时候结束、进程有没有僵死等各种信息。

-e:显示所有进程,环境变量;

-f:全格式

-h:不显示标题

-l:长格式

-w:宽输出

-A:列出所有的进程

-au:现实较详细的资讯

-aux:现实所有包含其他使用者的进程

au(x) 输出格式 :

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

USER: 行程拥有者            ;          PID: pid          ;          %CPU: 占用的 CPU 使用率           ;         %MEM: 占用的记忆体使用率
VSZ: 占用的虚拟记忆体大小              ;           RSS: 占用的记忆体大小             ;            TTY: 终端的次要装置号码 (minor device number of tty)
STAT: 该行程的状态:
     D: 不可中断的静止
     R: 正在执行中
     S: 静止状态
     T: 暂停执行
     Z: 不存在但暂时无法消除 
     W: 没有足够的记忆体分页可分配
     <: 高优先序的行程
     N: 低优先序的行程
     L: 有记忆体分页分配并锁在记忆体内 (即时系统或捱A I/O)
START: 行程开始时间             ;            TIME: 执行的时间            ;           COMMAND:所执行的指令

原创粉丝点击