读书笔记之:LINUX与UNIX Shell编程指南

lyjinger读书笔记之:LINUX与UNIX Shell编程指南

原书信息:
名称:Linux and Unix Shell Programming
版本:
作者:David Tansley
译者:张春萌


相关知识:
脚本使用shell类型:
1. 如果Script的第一个非空白字元不是"#",则它会使用Bourne Shell。 
2. 如果Script的第一个非空白字元是"#"时,但不以"#!"开头时,则它会使用C Shell。 
3. 如果Script以"#!"开头,则"#!"後面所写的就是所使用的Shell,而且要将整个路径名称指出来。
Bourne Shell的路径名称为/bin/sh ,而C Shell 则为/bin/csh。

shell变量类型:
1. 使用者变量
2. 系统变量(环境变量)
3. 只读的使用者变量
4. 特殊变量

脚本中命令书写:
1. 直接写命令
  这个方式和在命令列中直接下命令的效果一样。
2. 使用sh命令
  这个档案必须是Bourne Shell的Script,但这个档案并不一定要设成可执行。
3. 使用"."命令 
  这时和使用sh命令相似,只不过它不像sh一般会产生新的process ,相反地, 它会在原有的process 下完成工作。
4. 使用exec命令
  此时这个Script将会被所执行的命令所取代。当这个命令执行完毕之後,这个 Script也会随之结束。
5. 使用命令替换
  将命令列于两个"`" 号之间,而Shell 会以这个命令执行后的输出结果代替这个命令以及两个"`" 符号。

shell程序的调试方式:
  sh -v shell_script
  sh -x shell_script
    -v就是逐行执行并且详细跟踪每一行的执行情况,而-x是跟踪执行,并读取参数。
  set -v
  set +v
    成对出现,设置断点。


读书笔记:
文件类型:
  d 目录。
  l 符号链接(指向另一个文件)。
  s 套接字文件。
  b 块设备文件。
  c 字符设备文件。
  p 命名管道文件。
  - 普通文件,或者更准确地说,不属于以上几种类型的文件。

chmod命令的一般格式为:
  chmod [who] operator [permission] filename
  who的含义是:
    u 文件属主权限。
    g 同组用户权限。
    o 其他用户权限。
    a 所有用户(文件属主、同组用户及其他用户)。
  operator的含义:
    + 增加权限。
    - 取消权限。
    = 设定权限。
  permission的含义:
    r 读权限。
    w 写权限。
    x 执行权限。
    s 文件属主和组s e t - I D。
    t 粘性位。
    “t”代表了粘性位。如果在一个目录上出现“t”位,这就意味着该目录中的文件只有其属主才可以删除,
      即使某个同组用户具有和属主同等的权限

chmod绝对模式:
  chmod [mode] file
    r    w    x
    4    2    1
    suid guid
    4    2
  suid意味着如果某个用户对属于自己的shell脚本设置了这种权限,那么其他用户在执行这
一脚本时也会具有其属主的相应权限。同样的原则也适用于g u i d,执
行相应脚本的用户将具有该文件所属用户组中用户的权限。

groups - print the groups a user is in
id - print real and effective UIDs and GIDs

umask nnn
1) 文件的最大权限     rwx rwx rwx (777)
2) umask值为0 0 2     --- --- -w-
3) 目录权限           rwx rwx r-x (775) 这就是目录创建缺省权限
4) 文件权限           rw- rw- r-- (664) 这就是文件创建缺省权限

ln [-s] source_path target_path

Find命令的一般形式为:
  find pathname -options [-print -exec -ok]
  让我们来看看该命令的参数:
    pathname    find命令所查找的目录路径。
    -print      find命令将匹配的文件输出到标准输出。
    -exec       find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' {} /;,
                注意{ }和/;之间的空格。
    -ok         和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,
                在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
  find命令选项
    -name       按照文件名查找文件。
    -perm       按照文件权限来查找文件。
    -prune      使用这一选项可以使find命令不在当前指定的目录中查找
    -user       按照文件属主来查找文件。
    -group      按照文件所属的组来查找文件。
    -mtime -n +n 按照文件的更改时间来查找文件, -n表示文件更改时间距现在n天以内,+n
                表示文件更改时间距现在n天以前。
    -nogroup    查找无有效所属组的文件
    -nouser     查找无有效属主的文件
    -newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。
    -type 查找某一类型的文件,诸如:
      b - 块设备文件。
      d - 目录。
      c - 字符设备文件。
      p - 管道文件。
      l - 符号链接文件。
      f - 普通文件。
    -size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
    -depth     在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
    -fstype    查找位于某一类型文件系统中的文件
    -mount     在查找文件时不跨越文件系统mount点。
    -follow    如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。

  find /etc -name "host*" -print
  find . -perm 755 -print
  find . -perm -007 -print
    -perm mode
              File's permission bits are exactly  mode  (octal  or  symbolic).
              Symbolic modes use mode 0 as a point of departure.
    -perm -mode
              All of the permission bits mode are set for the file.
    -perm +mode
              Any of the permission bits mode are set for the file.

如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:
  find /apps -name "/apps/bin" -prune -o -print

  find ~ -user dave -print
  find /home -nouser -print
  find /apps -group accts -print
  fine / -nogroup -print

希望在系统根目录下查找更改时间在5日以内的文件,可以用:
  find / -mtime -5 -print
为了在/var/adm目录下查找更改时间在3日以前的文件,可以用:
  find /var/adm -mtime +3 -print

假设现在的时间是23:40,希望查找更改时间在两个小时以内的文件,可以首先创建这样一个文件:
  touch -t 05042140 dstamp
现在我们就可以使用find命令的-newer选项在当前目录下查找所有更改时间在两个小时以
内的文件:
  find . -newer dstamp -print

  find /etc -type l -print
  find . -size +1000000c -print
  find . -size +10 -print

在下面的例子中, find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。
它将首先匹配所有的文件然后再进入子目录中查找。
  find / -name "CON.FILE" -depth -print
在当前的文件系统中查找文件(不进入其他文件系统)
  find . -name "*.XC" -mount -print

一旦find命令匹配到了相应的文件,就可以用-exec选项中的命令对其进行操作
  find /var/log -type f -mtime +5 -exec rm {} /;
  当使用诸如mv或rm命令时,可以使用-ok选项。式。它将在对每个匹配到的文件进行操作之前提示你

  Find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,
不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将
匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,
因而效率不高;而使用xargs命令则只有一个进程

下面的例子在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到
/tmp/core.log 文件中:
  find . -name "core" -print | xargs echo "" >/tmp/core.log
下面的例子在/apps/audit目录下查找所有用户具有读、写和执行权限的文件,并收回相应
的写权限:
  find /apps/audit -perm -7 -print | xargs chmod o-w

crontab的域
  第1列分钟1~59
  第2列小时1~23(0表示子夜)
  第3列日1~31
  第4列月1~12
  第5列星期0~6(0表示星期天)
  第6列要运行的命令
下面是c r o n t a b的格式:
  分< >时< >日< >月< >星期< >要运行的命令
  其中< >表示空格。

crontab命令的一般形式为:
  crontab [-u user] -e -l -r
其中:
  -u 用户名。
  -e 编辑c r o n t a b文件。
  -l 列出c r o n t a b文件中的内容。
  -r 删除c r o n t a b文件。

crontab <filename>

at命令的基本形式为:
  at [-f script] [-m -l -r] [time] [date]
其中,
  -f script 是所要提交的脚本或命令。
  -l 列出当前所有等待运行的作业。atq命令具有相同的作用。
  -r 清除作业。
  -m 作业完成后给用户发邮件。
  time 时间格式:可以是H、HH.HHMM、HH:MM或H:M。还可以使用a.m.或p.m.。
  date 日期格式可以是月份数或日期数,而且at命令还能够识别诸如today、tomorrow这样的词。

使用&命令把作业放到后台执行。
该命令的一般形式为:
  命令&
  command >out.file 2>&1 &

nohup在你退出帐户之后继续运行相应的进程
该命令的一般形式为:
  nohup command &

文件名匹配:
  * 匹配文件名中的任何字符串,包括空字符串。
  ? 匹配文件名中的任何单个字符。
  [...] 匹配[ ]中所包含的任何字符。
  [!...] 匹配[ ]中非感叹号!之后的字符。

echo string
echo命令有很多功能,其中最常用的是下面几个:
  /c 不换行。
  /f 进纸。
  /t 跳格。
  /n 换行。
  /007 响铃。
LINUX系统,必须使用-n选项来禁止echo命令输出后换行,使用-e选项使转义符生效

使用read语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。
它的一般形式为:
  read varible1 varible2 ...

cat命令的一般形式为:
  cat [options] filename1 ... filename2 ...
cat命令最有用的选项就是:
  -v 显示控制字符
  如果希望创建一个新文件,并向其中输入一些内容,只需使用cat命令把标准输出重定向
  到该文件中,这时cat命令的输入是标准输入—键盘,你输入一些文字,输入完毕后按
  <CTRL-D>结束输入。

通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠|表示。它的一
般形式为:
  命令1 |命令2

tee命令把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中。
它的一般形式为:
  tee -a files
其中,-a表示追加到文件末尾。

使用who命令,结果输出到屏幕上,同时保存在who.out文件中:
  who |tee who.out

常用文件重定向命令:
  command > filename 把标准输出重定向到一个新文件中
  command >> filename 把标准输出重定向到一个文件中(追加)
  command 1 > fielname 把标准输出重定向到一个文件中
  command > filename 2>&1 把标准输出和标准错误一起重定向到一个文件中
  command 2 > filename 把标准错误重定向到一个文件中
  command 2 >> filename 把标准输出重定向到一个文件中(追加)
  command >> filename 2>&1 把标准输出和标准错误一起重定向到一个文件中(追加)
  command < filename >filename2 command命令以filename文件作为标准输入,以filename2文件
  作为标准输出
  command < filename command命令以filename文件作为标准输入
  command << delimiter 从标准输入中读入,直至遇到delimiter分界符
  command <&m 把文件描述符m作为标准输入
  command >&m 把标准输出重定向到文件描述符m中
  command <&- 关闭标准输入

exec命令可以用来替代当前shell。使用这一命令时任何现
有环境都将会被清除,并重新启动一个shell。它的一般形式为:
  exec command
exec命令的一个常见用法就是在用户
的.profile最后执行时,用它来执行一些用于增强安全性的脚本。如果用户的输入无效,该
shell将被关闭,然后重新回到登录提示符。

使用&&的一般形式为:
  命令1 && 命令2
“如果这个命令执行成功& &那么执行这个命令”。
  mv /apps/bin /apps/dev/bin && rm -r /apps/bin

使用||的一般形式为:
  命令1 || 命令2
“如果这个命令执行失败了|| 那么就执行这个命令”。
  cp src.txt dst.txt || echo "copy failed."

为了在当前shell中执行一组命令,可以用命令分隔符隔开每一个命令,并把所有的命令
用圆括号括起来。
它的一般形式为:
  (命令1;命令2;. . .)

正则表达式
基本元字符集及其含义:
  ^ 只匹配行首
  $ 只匹配行尾
  * 一个单字符后紧跟*,匹配0个或多个此单字符
  [ ] 只匹配[ ]内字符。
  / 只用来屏蔽一个元字符的特殊含义。
  . 只匹配任意单字符
  pattern/{n/} 用来匹配前面pattern出现次数。n为次数
  pattern/{n,/}m 含义同上,但次数最少为n
  pattern/{n,m/} 只含义同上,但pattern出现次数在n与m之间

使用句点匹配单字符
  ...x..x..x
在行首以^匹配字符串或字符序列
  ^d
在行尾以$匹配字符串或字符
匹配所有空行,执行以下操作:
  ^$
使用*匹配字符串中的单字符或其重复序列
  compu*t
将匹配字符u一次或多次:
使用/屏蔽一个特殊字符的含义
  /.
使用[]匹配一个范围或集合
如要匹配任意字母或数字,模式如下:
  [A-Za-z0-9]

注意^符号的使用,当直接用在第一个括号里,意指否定或不匹配括号里内容。
匹配任一非字母型字符,而
  [^a-zA-Z]
匹配任一非数字型字符。
  [^0-9]

使用/{/}匹配模式结果出现的次数
  pattern/{n/} 匹配模式出现n次。
  pattern/{n,/} 匹配模式出现最少n次。
  pattern/{n,/m} 匹配模式出现n到m次之间,n , m为0-255中任意整数
匹配字母A出现两次,并以B结尾,操作如下:
  A/{2/}B
匹配A至少4次,使用:
  A/{4,/}B
A出现2次到4次之间:
  A/{2,4/}B

经常使用的正则表达式举例
  ^ 行首
  $ 行尾
  ^[the] 以the开头行
  [Ss]igna[lL] 匹配单词signal、signaL、Signal、SignaL
  [Ss]igna[lL]/. 同上,但加一句点
  [mayMAY] 包含may大写或小写字母的行
  ^USER$ 只包含USER的行
  [tty]$ 以tty结尾的行
  /. 带句点的行
  ^d..x..x..x 用户、用户组及其他用户组成员有可执行权限的目录
  ^[^l] 排除关联目录的目录列表
  [.*0] 0之前或之后加任意字符
  [000*] 000或更多个
  [iI] 大写或小写I
  [iI][nN] 大写或小写i或n
  [^$] 空行
  [^.*$] 匹配行中任意字符串
  ^......$ 包括6个字符的行
  [a-zA-Z] 任意单字符
  [a-z][a-z]* 至少一个小写字母
  [^0-9/$] 非数字或美元标识
  [^0-0A-Za-z] 非数字或字母
  [123] 1到3中一个数字
  [Dd]evice 单词device或Device
  De..ce 前两个字母为De,后跟两个任意字符,最后为ce
  /^q 以^q开始行
  ^.$ 仅有一个字符的行
  ^/.[0-9][0-9] 以一个句点和两个数字开始的行
  "Device" 单词device
  De[Vv]ice/. 单词Device或device
  [0-9]/{2/}-[0-9]/{2/}-[0-9]/{4/} 日期格式dd-mm-yyyy
  [0-9]/{3/}/.[0-9]/{3/}/.[0-9]/{3/}/.[0-9]/{3/} IP地址格式nnn. nnn.nnn.nnn
  [^.*$] 匹配任意行

grep一般格式为:
  grep [选项]基本正则表达式[文件]

在grep命令中输入字符串参数时,最好将其用双引号括起来。
在调用变量时,应使用双引号
在调用模式匹配时,应使用单引号。
常用的grep选项有:
  -c 只输出匹配行的计数。
  -i 不区分大小写(只适用于单字符)。
  -h 查询多文件时不显示文件名。
  -l 查询多文件时只输出包含匹配字符的文件名。
  -n 显示匹配行及行号。
  -s 不显示不存在或无匹配文本的错误信息。
  -v 显示不包含匹配文本的所有行。

  grep "sort it" *
  grep -c "48" data.f
  grep -n "48" data.f
  grep -v "48" data.f

使用grep抽取精确匹配的一种方式是在抽取字符串后加/>。
  grep '48/>' data.f
  grep -i "sept" data.f

有三种方式调用awk,第一种是命令行方式,如:
  awk [-F filed-seperator] 'commands' input-files(s)
  awk使用空格作为缺省的域分隔符
第二种方法是将所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释
器作为脚本的首行,以便通过键入脚本名称来调用它。
第三种方式是将所有的awk命令插入一个单独文件,然后调用:
  awk -f awk-script-file input-files(s)

保存awk输出
  awk '{print $0}' grade.txt >wow
  awk执行时,其浏览域标记为$1,$2...$n。这种方法称为域标识。

打印信息头尾
awk 'BEGIN {print "Name/n-------"} {print $1} END {"end-of-report"}'

awk条件操作符
  < 小于
  <= 小于等于
  == 等于
  != 不等于
  >= 大于等于
  ~ 匹配正则表达式
  !~ 不匹配正则表达式

  awk 'if($4~/Brown) print $0' grade.txt
  awk '$3=="48" {print $0}' grade.txt
  awk '{if ($1=="P.Bunny" $$ $4=="Yello") print $0}' grade.txt
  awk '{if ($4=="Yello" || $4~/Brown/) print $0}' grade.txt

awk内置变量
  ARGC 命令行参数个数
  ARGV 命令行参数排列
  ENVIRON 支持队列中系统环境变量的使用
  FILENAME awk浏览的文件名
  FNR 浏览文件的记录数
  FS 设置输入域分隔符,等价于命令行-F选项
  NF 浏览记录的域个数
  NR 已读的记录数
  OFS 输出域分隔符
  ORS 输出记录分隔符
  RS 控制记录分隔符
 
awk内置字符串函数
  gsub(r,s) 在整个$0中用s替代r
  gsub(r,s,t) 在整个t中用s替代r
  index(s,t) 返回s中字符串t的第一位置
  length(s) 返回s长度
  match(s,r) 测试s是否包含匹配r的字符串
  split(s,a,fs) 在fs上将s分成序列a
  sprint(fmt,exp) 返回经fmt格式化后的exp
  sub(r,s) 用$0中最左边最长的子串代替s
  substr(s,p) 返回字符串s中从p开始的后缀部分
  substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分

调用sed有三种方式:在命令行键入命令;将sed命令插入脚本文件,然后调用sed;将sed
命令插入脚本文件,并使sed脚本可执行。

使用sed在文件中定位文本的方式
  x x为一行号,如1
  x,y 表示行号范围从x到y,如2,5表示从第2行到第5行
  /pattern/ 查询包含模式的行。例如/disk /或/[a-z]/
  /pattern/pattern/ 查询包含两个模式的行。例如/disk/disks/
  /pattern/,x 在给定行号上查询包含模式的行。如/ribbon/,3
  x,/pattern/ 通过行号和模式查询匹配行。3./vdu/
  x,y! 查询不包含指定行号x和y的行。1,2!
 
sed编辑命令
  p 打印匹配行
  = 显示文件行号
  a/ 在定位行号后附加新文本信息
  i/ 在定位行号后插入新文本信息
  d 删除定位行
  c/ 用新文本替换定位文本
  s 使用替换模式替换相应模式
  r 从另一个文件中读文本
  w 写文本到一个文件
  q 第一个模式匹配完成后推出或立即推出
  l 显示与八进制A S C I I代码等价的控制字符
  {} 在定位行执行的命令组
  n 从另一个文件中读文本下一行,并附加在下一行
  g 将模式2粘贴到/pattern n/
  y 传送字符
  n 延续到下一输入行;允许跨行的模式匹配语句

sort命令的一般格式为:
  sort -cmu -o output_file [other options] +pos1 +pos2 input_files
  下面简要介绍一下s o r t的参数:
  -c 测试文件是否已经分类。
  -m 合并两个分类文件。
  -u 删除所有复制行。
  -o 存储s o r t结果的输出文件名。
  其他选项有:
  -b 使用域进行分类时,忽略第一个空格。
  -n 指定分类是域上的数字分类。
  -t 域分隔符;用非空格或t a b键分隔域。
  -r 对分类次序或比较求逆。
  +n n为域号。使用此域号开始分类。
  n n为域号。在分类比较时忽略此域,一般与+ n一起使用。
  post1 传递到m,n。m为域号,n为开始分类字符数;例如4,6意即以第5域分类,从第7
  个字符开始。

uniq用来从一个文本文件中去除或禁止重复行。
命令一般格式:
  uniq -u d c -f input-file output-file
  其选项含义:
  -u 只显示不重复行。
  -d 只显示有重复数据行,每种重复行只显示其中一行
  -c 打印每一重复行出现次数。
  -f n为数字,前n个域被忽略。一些系统不识别- f选项,这时替代使用-n。

join用来将来自两个分类文本文件的行连在一起。其一般格式为:
  join [options] input-file1 input-file2
  下面讲述join工作方式。这里有两个文件file1和file2,当然已经分类。每个文件里都有一
些元素与另一个文件相关。由于这种关系,join将两个文件连在一起,这有点像修改一个主文
件,使之包含两个文件里的共同元素。
  让我们看看它的可用选项列表:
  an n为一数字,用于连接时从文件n中显示不匹配行。
  o n.m n为文件号,m为域号。1.3表示只显示文件1第三域,每个n,m必须用逗号分隔
  j n m n为文件号,m为域号。使用其他域做连接域。
  t 域分隔符。用来设置非空格或t a b键的域分隔符。

cut用来从标准输入或文本文件中剪切列或域。剪切文本可以将之粘贴到一个文本文件。
cut一般格式为:
  cut [options] file1 file2
  下面介绍其可用选项:
  -c list 指定剪切字符数。
  -f field 指定剪切域数。
  -d 指定与空格和t a b键不同的域分隔符。

  -c用来指定剪切范围,如下所示:
  -c 1,5-7 剪切第1个字符,然后是第5到第7个字符。
  -c 1-50 剪切前50个字符。
  -f 格式与-c相同。
  -f 1,5 剪切第1域,第5域。
  -f 1,10-12 剪切第1域,第10域到第12域。

cut用来从文本文件或标准输出中抽取数据列或者域,然后再用paste可以将这些数据粘贴
起来形成相关文件。
paste格式为:
  paste -d -s -file1 file2
  选项含义如下:
  -d 指定不同于空格或tab键的域分隔符。
  -s 将每个文件合并成行而不是按行粘贴。
  - 使用标准输入。例如ls -l |paste ,意即只在一列上显示输出。

split用来将大文件分割成小文件。有时文件越来越大,传送这些文件时,首先将其分割可
能更容易。
split命令一般格式:
  split -output_file-size input-filename output-filename
  这里output-file-size指的是文本文件被分割的行数。

tr用来从标准输入中通过替换或删除操作进行字符转换。
tr主要用于删除文件中控制字符或进行字符转换。
使用tr时要转换两个字符串:字符串1用于查询,字符串2用于处理各种转换。
带有最常用选项的t r命令格式为:
  tr -c -d -s ["string1_to_translate_from"] ["string2_to_triannpsulta_te_to"] file
  这里:
  -c 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。
  -d 删除字符串1中所有输入字符。
  -s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符
  串。
  Input-file是转换文件名。虽然可以使用其他格式输入,但这种格式最常用。

tr中特定控制字符的不同表达方式:
  速记符    含义   八进制方式
  /a Ctrl-G 铃声   /007
  /b Ctrl-H 退格符 /010
  /f Ctrl-L 走行换页/014
  /n Ctrl-J 新行   /012
  /r Ctrl-M 回车   /015
  /t Ctrl-I tab键  /011
  /v Ctrl-X        /030

  登录成功后,系统执行两个环境设置文件,第一个是/etc/profile,第二个是~/.bash_profile
  用户登录时,自动读取/etc目录下profile文件,此文件包含:
    全局或局部环境变量。
    PATH信息。
    终端设置。
    安全命令。
    日期信息或放弃操作信息。

使用变量时,用花括号将之括起来

变量设置时的不同模式:
  Variable-name = value 设置实际值到variable-name
  Variable-name + value 如果设置了variable-name,则重设其值
  Variable-name :? value 如果未设置variable-name,显示未定义用户错误信息
  Variable-name ? value 如果未设置variable-name,显示系统错误信息
  Variable-name := value 如果未设置variable-name,设置其值
  Variable-name :- value 同上,但是取值并不设置到variable-name,可以被替换

使用unset命令清除变量。
使用命令readonly设置只读变量

设置环境变量
  VARIABLE-NAME=value; export VARIABLE-NAME
or
  VARIABLE-NAME=value
  export VARIABLE-NAME
or export VARIABLE-NAME=value

嵌入shell变量
1. CDPATH
  改变目录路径变量,保留一系列由冒号隔开的路径名,用于cd命令。
2. EXINIT
  EXINIT变量保存使用vi编辑器时的初始化选项。
3. HOME
  HOME目录,通常定位于passwd文件的倒数第2列,用于保存用户自身文件。
4. IFS
  IFS用作shell指定的缺省域分隔符。原理上讲域分隔符可以是任意字符,但缺省通常为空
格、新行或tab键。
5. LOGNAME
  此变量保存登录名
6. MAIL
  MAIL变量保存邮箱路径名,缺省为/var/spool/mail/<login name>。
7. MAILCHECK
  MAILCHECK缺省每60s检查新邮件
8. MAILPATH
  如果有多个邮箱要用到MAILPATH,此变量设置将覆盖MAIL设置。
9. PATH
  PATH变量保存进行命令或脚本查找的目录顺序
10. PS1
  基本提示符包含shell提示符,缺省对超级用户为#,其他为$。
11. PS2
  PS2为附属提示符,缺省为符号> 。
12. SHELL
  SHELL变量保存缺省shell,通常在/etc/passwd中已设置
13. TERMINFO
  终端初始化变量保存终端配置文件的位置。通常在/usr/lib/terminfo或/usr/share/terminfo
14. TERM
  TERM变量保存终端类型。设置TERM使应用获知终端对屏幕和键盘响应的控制序列类型,
常用的有vt100、vt200、vt220-8等。
15. TZ
  时区变量保存时区值,
其他环境变量
1. EDITOR
  设置编辑器,最常用。
  EDITOR=vi; export EDITOR
2. PWD
  当前目录路径名,用cd命令设置此选项。
3. PAGER
  保存屏幕翻页命令,如pg、more,在查看man文本时用到此功能。
  PAGER='pg -f -p%;export PAGER
4. MANPATH
  保存系统上man文本的目录。目录间用冒号分隔。
  MANPATH=/usr/apps/man:/usr/local/man; export MANPATH
5. LPDEST或PRINTER
  保存缺省打印机名,用于打印作业时指定打印机名。
  LPDEST=hp3si-systems

使用set命令-a选项,即set -a指明所有变量直接被导出。

位置变量参数
  参数从第一个开始,在第9个结束;每个访问参数前要加$符号。第一个
参数为0,表示预留保存实际脚本名字
特定变量参数
  $# 传递到脚本的参数个数
  $* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
  $$ 脚本运行的当前进程ID号
  $! 后台运行的最后一个进程的进程ID号
  $@ 与$#相同,但是使用时加引号,并在引号中返回每个参数
  $- 显示shell使用的当前选项,与set命令功能相同
  $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

反引号用于设置系统命令的输出到变量。shell将反引号中的内容作为一个系统命令,并
执行其内容。
如果下一个字符有特殊含义,反斜线防止shell误解其含义,即屏蔽其特殊含义。下述字
符包含有特殊意义:& * + ^ $ ` " | ?。

脚本第一行总是以#!/bin/sh开始,这段脚本通知shell使用系统上的Bourne shell解释器。

测试文件状态
  test condition

  [ condition ]
使用方括号时,要注意在条件两边加上空格。
  -d 目录
  -f 正规文件
  -L 符号连接
  -r 可读
  -s 文件长度大于0、非空
  -w 可写
  -u 文件有suid位设置
  -x 可执行

测试时使用逻辑操作符
  -a 逻辑与,操作符两边均为真,结果为真,否则为假。
  -o 逻辑或,操作符两边一边为真,结果为真,否则为假。
  ! 逻辑否,条件为假,结果为真。

字符串测试有5种格式:
  test "string"
  test string_operator "string"
  test "string" string_operator "string"
  [ string_operator string ]
  [ string string_operator string ]
  这里,string_operator可为:
    = 两个字符串相等。
    != 两个字符串不等。
    -z 空串。
    -n 非空串。

测试数值
一般格式如下:
  "number" numeric_operator "number"
或者
  [ "number" numeric_operator "number" ]
  numeric_operator可为:
  -eq 数值相等。
  -ne 数值不相等。
  -gt 第一个数大于第二个数。
  -lt 第一个数小于第二个数。
  -le 第一个数小于等于第二个数。
  -ge 第一个数大于等于第二个数。

expr命令一般用于整数值,但也可用于字符串。一般格式为:
  expr argument operator argument
expr也是一个手工命令行计数器。使用乘号时,必须用反斜线屏蔽其特定含义
expr在循环中用于增量计算。
  LOOP = 0
  LOOP = `expr $LOOP + 1`
可以用expr测试一个数。如果试图计算非整数,将返回错误
  expr rr + 1
可以使用expr通过指定冒号选项计算字符串中字符数。
  expr $NUM : October 8, '.*'

要退出当前进程,shell提供命令exit,一般格式为:
  exit n

if then else语句:
  if 条件1
  then
    命令1
  elif 条件2
  then
    命令2
  else
    命令3
  fi

  有时需要知道脚本运行是交互模式(终端模式)还是非交互模式(cron或at)。使用test命令并带有-t选项很容易确认
这一点。如果test返回值为1,则为交互模式。

shell提供了:空命令:永远为真
  if [] ;then
    [cmd]
  else :
  fi

case语句:
  case 值in
  模式1)
    命令1
    ...
    ;;
  模式2)
    命令2
    ...
  *)
    exit 1
    ;;
  esac

  使用case时,也可以指定“|”符号作为条件或命令

for循环:
  for 变量名 in列表
  do
    命令1
    命令2
  done

until循环:
  until 条件
    命令1
    ...
  done

while循环:
  while 条件
  do
    命令1
    命令2
    ...
  done

使用break和continue控制循环

shell函数
定义函数的格式为:
函数名()
{
  命令1
  ...
}
如果愿意,可在函数名前加上关键字function

  执行函数时,它保留当前shell和内存信息。此外如果执行或调用一个脚本文件中的另一段代码,将创建一个单独的
shell,因而去除了所有原脚本中定义的存在变量。

  所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器
首次发现它时,才可以使用。调用函数仅使用其函数名即可。

  向函数传递参数就像在一般脚本中使用特殊变量$1,$2...$9一样,函数取得所传参数后,
将原始参数传回shell脚本,因此最好先在函数内重新设置变量保存所传的参数。
  可以直接在脚本调用函数语句的后面使用最后状态命令来测试函数调用的返回值

  当你收集一些经常使用的函数时,可以将之放入函数文件中并将文件载入shell。
  一旦文件载入shell,就可以在命令行或脚本中调用函数。可以使用set命令查看所有定义
的函数。输出列表包括已经载入shell的所有函数。
  如果要改动函数,首先用unset命令从shell中删除函数,改动完毕后,再重新载入此文件。

文件已经创建好了,将之载入shell:
  . functions.main # . = source

删除函数时unset命令格式为:
  unset function_name

从函数文件中调用函数,在当前脚本中调用
. /[path]/[script-file]
定位文件不只针对于函数,也包含组成配置文件的全局变量。

向脚本传递参数时,有时需要将每一个参数偏移以处理选项,这就是shift命令的功能。
它每次将参数位置向左偏移一位,
#!/bin/sh
loop=0

while [ $# -ne 0 ]
do
  echo $1
  shift
done

命令行输入的最后一个参数:
  使用命令eval echo /$$#
  使用shift命令:shift 'expr $# -2'。

getopts一般格式为:
  getopts option_string variable

set命令辅助脚本调试选项:
  set -n 读命令但并不执行。
  set -v 显示读取的所有行。
  set -x 显示所有命令及其参数。
  在脚本开始时使用了set -x,并在结尾部分关闭它。

shell嵌入命令完整列表
  : 空,永远返回为true
  . 从当前shell中执行操作
  break 退出for、while、until或case语句
  cd 改变到当前目录
  continue 执行循环的下一步
  echo 反馈信息到标准输出
  eval 读取参数,执行结果命令
  exec 执行命令,但不在当前shell
  exit 退出当前shell
  export 导出变量,使当前shell可利用它
  pwd 显示当前目录
  read 从标准输入读取一行文本
  readonly 使变量只读
  return 退出函数并带有返回值
  set 控制各种参数到标准输出的显示
  shift 命令行参数向左偏移一个
  test 评估条件表达式
  times 显示shell运行过程的用户和系统时间
  trap 当捕获信号时运行指定命令
  ulimit 显示或设置shell资源
  umask 显示或设置缺省文件创建模式
  unset 从shell内存中删除变量或函数
  wait 等待直到子进程运行完毕,报告终止

使用date命令创建日志文件:
#!/bin/sh

MYDATE=`date +%d%m%y`
LOGFILE=/var/log/backop_log.$MYDATE
>$LOGFILE

一些常用的日期格式:
  date +%d-%m-%y #30-05-07
  date +%D #05/30/07
  date +%Y_%m_%d #2007_05_30
  date +%T #14:39:40
  date +%H%M%S #144004

创建唯一的临时文件
#!/bin/sh

TMPFILE=/tmp/temp.$$
df -k > $TMPFILE
rm -f $TMPFILE

信号
1 SIGHUP 挂起或父进程被杀死
2 SIGINT 来自键盘的中断信号,通常是<CTRL-C>
3 SIGQUIT 从键盘退出
9 SIGKILL 无条件终止
11 SIGSEGV 段(内存)冲突
15 SIGTERM 软件终止(缺省杀进程信号)

杀死一个进程
  kill -9

trap可以使你在脚本中捕捉信号。该命令的一般形式为:
  trap name signal(s)
其中,name是捕捉到信号以后用来处理所捕捉信号的函数,需要用双引号引起来。
  signal就是待捕捉的信号。

  trap "" 2 3 忽略信号2和信号3,用户不能终止该脚本
  trap "commands" 2 3 如果捕捉到信号2或3,就执行相应的commands命令
  trap 2 3 复位信号2和3,用户可以终止该脚本

eval命令将会首先扫描命令行进行所有的置换,然后再执行该命令。

当希望在系统全局的日志文件中记录信息的时候,logger命令是一个非常好的工具。

运行级别脚本
  rc.scripts一般保存在/etc/rcN.d或/etc/rc.d/rcN.d目录下,其中,N是一个数字。

确定当前的运行级别
  who -r

inittab文件中每个条目的格式为:
  id:rstart:action:process
  其中,id域是相应进程的唯一标识。
  rstart域所包含的数字表示运行该进程的级别。
  action域告诉init进程如何对待process所对应的进程。最常见的是wait和respawn。
    wait意味着当进程启动后等待它结束。respawn则意味着如果该进程不
    存在,则启动相应的进程,如果它存在,那么只要它一掉下来就立即重新启动它。
  process域包含了实际要运行的命令。

  init进程在系统完全就绪之前所做的最后几项工作之一就是执行缺省运行级别所包含的所有脚本
依次查看相应运行级别目录中的文件,给每一个链接名以K开头的相应脚本赋予参数stop; 给每一个链接
名以S开头的相应脚本赋予参数start。

  运行级别0 启动和停止整个系统
  运行级别1 单用户或管理模式
  运行级别2 多用户模式;部分网络服务被启动。有些系统将其作为正常运行模式,而不是级别3
  运行级别3 正常操作运行模式,启动所有的网络服务
  运行级别4 用户定义的模式,可以使用该级别来定制所需要运行的服务
  运行级别5 有些UNIX操作系统变体将其作为缺省X-windows模式,还有些系统把它作为系统维护模式
  运行级别6 重启动

如果想要安装自己的运行级别脚本,必须:
  编写该脚本,确保它符合调用标准。
  确信它能够启动或终止相应的服务。
  将该脚本放置于(取决于操作系统)/etc/init.d或/usr/sbin/init.d或/etc/rc.d中。
  在相应的rcN.d目录中按照合理的命名方式创建链接。

使用inittab来启动应用程序
  /ect/rc.local在inittab和运行级别脚本之后运行。可以在该文件中加入任何命令,或从中调用最习惯用的启
动脚本。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值