插一篇 Linux shell

shell以 #!/bin/sh开头,除此外#表示一行注释的开始。

 

变量:

   变量无需事先声明。

   $var表示引用变量var的值,如无定义则无值

   $(var)同上,用于同$varx等区分

   $(var:-thing),var存在且非null,取var的值,不然取thing的值,var的值不受影响

   $(var:+thing),var存在且非null,取thing的值,不然无值

   $(var:=thing),var存在且非null,取var的值,var的值不变,不然取thing的值,var的值改成thing

   $(var:?message),var存在且非null,取var的值,不然打印message并退出,如果message未定义则打印parameter null or not set

   上面的冒号可选,没有冒号时只要存在即可,不判断是否null

 

   一些特殊变量

   $# 目前进程参数个数

   $@ 传递给当前进程命令行参数,置于双引号中时可被展开

   $* 当前进程命令行参数,置于双引号时展开一个。

   $- 连字符,给予shell选择项

   $? 前一退出状态,如对timeout的判断

   $$ 进程标示符

   $0 进程名称

   $! 最后一个后台命令的进程编号

   $HOME 根目录

   $PATH 命令查找路径

   $PWD 当前工作目录

   ${#var} 返回字符串var的长度 

 

模式匹配运算符:

   ${var#pattern} 删除匹配的最短部分,如var=/home/user/downloads/src/file.c, 那么${var#/*/}即为user/downloads/src/file.c,通配符表示不管两个//中间内容。

   ${var##pattern} 删除匹配的最长部分,如var=/home/user/downloads/src/file.c, 那么${var##/*/}即为file.c,通配符表示不管两个//中间内容。

   ${var%pattern} 删除右边开始匹配的最短部分,如var=/home/user/downloads/src/file.c, 那么${var%/*}即为/home/user/downloads/src。

   ${var%%pattern}删除右边开始匹配的最长部分,如var=/home/user/downloads/src/file.c, 那么${var%%/*}即为空。

 

条件判断:if then elif then else fi

   快捷符号 &&和 ||, 如if [] && do_sth then... 和if [] || do_sth。

   因为shell从左往右执行,所以对于&&,如果if不为真,那么就没必要再去判断do_sth了,即do_sth不执行,

   对于||,如果if为真,那么就没必要去判断do_sth,即do_sth不执行。

 

   test表达式即if [ test ]:

   运算符                        真

   string                        string不为NULL

   -b file                        file是块设备文件

   -c file                         file是字符描述文件

   -d file                        file是文件夹

   -e file                        file存在

   -f file                         file为一般文件

   -g file                        file有设置它的setgid定位

   -h (或者-L)file          file是符号链接

   -n string                    string非NULL

   -p file                        file是管道pipe

   -r file                        file可读

   -s file                        file不是空的

   -S file                        file是socket

   -t n                          文件描述符n指向终端

   -u file                       file有设置它的setuid定位

   -w file                       file可写

   -x file                       file可执行或是可搜索的目录

   -z string                   string为NULL

   s1 = s2                    相等

   s1 != s2                   不等

   n1 -eq n2                 整数相等

   n1 -ne n2                 整数不等

   n1 -lt  n2                 n1<n2

   n1 -gt n2                 n1>n2

   n1 -le n2                  n1<=n2

   n1 -ge n2                 n1>=n2

 

   在test前加!表示否定结果,-a表示而且,-o表示或者,-a的优先级高于-o,如

  if [ -n “$string” -a -f “$file”]   在结果上等同于 if [ -n “$string” ] && [ -f “$file” ]   ,引号最好加上,不然字符串为空时可能导致奇怪问题,比如[-n -a -f $file]

   另为防止字符串以-开头时产生的问题,通常加上x,如

   如if [ "x$1" = "xnand" ] 表示判断输入的第一个参数是否是"nand"

 

 

getopt:  getopt后的参数如果紧跟冒号,表示这个参数是必须的,如update ht:d:f:m:c,这里tdfm都是必须的。

 

 

暂时用到那么多,有需要再来编辑。

 

你可能感兴趣的:(Linux shell)