• shell 脚本编程概述


      1 环境变量
      2 
      3 
      4 ?            退出状态码 0(成功) 1(未知错误) 2(误用 shell 命令) 126(命令不可执行) 127(没找到命令) 128(无效退出状态) 128+x( linux 信号 X 的严重错误) 130( ctrl  c 终止程序 ) 255(退出状态码越界)
      5 #            命令行参数个数
      6 @            以“参数1”“参数2”...形式保存所有参数
      7 *            以“参数1 参数2...”形式保存所有参数
      8 $            本程序的 PID
      9 !            上一个命令的 PID
     10 0            当前程序文件名
     11 n            命令行参数,第 n 个参数,$0 表示文件名
     12 LANG            当前语言环境,zh_CN.utf8
     13 SHELL            当前的命令解释器
     14 PATH            命令搜索路径,以冒号为分隔符,注意与DOS下不同的是,当前目录不在系统路径里
     15 HOME            用户home目录的路径名,是cd命令的默认参数
     16 COLUMNS            命令编辑模式下可使用的命令行的长度
     17 EDITOR            默认的行编辑器
     18 VISUAL            默认的可视编辑器
     19 FCEDIT            命令fc使用的编辑器
     20 HISTFILE        命令历史文件
     21 HISTSIZE        命令历史文件中最多可包含的命令条数
     22 IFS            定义 shell 使用的分隔符,指定了在命令行中用来分隔参数的字符,其默认值为空格,制表符和换行符。但无论IFS的值是什么,用户总是可以使用空格符和制表符来分隔参数;
     23 LOGNAME            用户登录名
     24 MAIL            保存邮件的位置    
     25 MAILCHECK        shell检查MAIL文件的周期,单位是秒
     26 MAILPATH        功能与MAIL类似,但可以是一组文件,以冒号分隔
     27 RANDOM            小于等与 5 位数的随机数
     28 SHELL            shell的路径名
     29 TERM            终端的类型
     30 TMOUT            shell自动退出的时间,若为0则禁止shell自动退出
     31 PS1            主命令提示符
     32 PS2            二级命令提示符,命令执行过程中要求输入数据时用
     33 PS3            select的命令提示符
     34 PS4            调试命令提示符
     35 MANPATH            寻找手册页的路径,以冒号分隔
     36 LD_LIBRARY_PATH        寻找库的路径,以冒号分隔
     37 
     38 
     39 自定义环境变量不能以数字开头,文件路径不用使用转义字符。
     40 export 导出全局变量
     41 
     42 
     43 
     44 Bash 执行命令的优先级:
     45 别名    关键字    函数    内建命令    脚本或可执行程序($PATH)
     46 
     47 
     48 
     49 shell 基本语法:
     50 
     51 
     52 关键字(由 bash 解释):if elif else (for in) then test until while case break continue echo clear let read
     53 
     54 
     55 if then...elif then......fi( if then...else...fi )
     56 while [condition] do...done
     57 for value in "hel" "hello" "world"...do...done
     58 case $value in...a)...;;b)...;;esac
     59 
     60 
     61 if-then 高级特性
     62 
     63 双尖括号 (())
     64 双方括号 [[]]
     65 
     66 
     67 if [$region –eq “1”]
     68 then
     69     echo “Hello, Bob”
     70 elif [$region –eq “2”]
     71 then
     72     echo “hello, Mary”
     73 elif [$region –eq “3”]
     74 then
     75     echo “hello, Joan”
     76 elif [$region –eq “4”]
     77 then
     78     echo “hello, Mike”
     79 elif [$region –eq “5”]
     80 then
     81     echo “hello, Tom”
     82 fi
     83 
     84 let flag=1
     85 while [“$flah” –lt 4]
     86 do
     87     for friend in Bob Mary Sue
     88     do
     89         echo “hello, $friend”
     90     done
     91     let flag=”$flag + 1 92 done 
     93 
     94 for friend in “Mary” “Joe” “Sue”
     95 do
     96     echo “hello, $friend”
     97 done
     98 
     99 for CPUFREQ in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do [ -f $CPUFREQ ] || continue; echo -n performance > $CPUFREQ; done
    100 
    101 case $region in
    102     1)
    103         echo “Hello, Bob”
    104         ;;
    105     2)
    106         echo “Hello, Mary”
    107         ;;
    108     3)
    109         echo “Hello, Joan”
    110         ;;
    111     4)
    112         echo “Hello, Mike”
    113         ;;
    114     *)
    115         echo “Hello, Tom”
    116         ;;
    117 esac
    118 
    119 
    120 
    121 内建命令
    122 
    123 bash   
    124 :  .  [  
    125 alias  
    126 bg  bind  break  builtin  
    127 caller  cd  command  compgen  complete  compopt  continue  
    128 declare  dirs  disown  
    129 echo  enable  eval  exec  exit  export  
    130 false  fc  fg  
    131 getopts  
    132 hash  help  history  
    133 jobs  
    134 kill  
    135 let  local  logout  
    136 mapfile  
    137 popd  printf  pushd  pwd  
    138 read  readonly  return  
    139 set  shift  shopt  source  suspend  
    140 test  times  trap  true  type  typeset  
    141 ulimit  umask  unalias  unset  
    142 wait
    143 
    144 dirs                    显示目录栈
    145 history                    HISTSIZE 会话期间保存的历史命令的条数,HISTFILESIZE 会话之间保存的历史命令的条数,HISTFILE 历史文件的位置
    146 source                    从文件中读取命令并执行,不管文件是否是脚本文件
    147 type [cmd]                给出 cmd 的完整路径;-a 鉴别参数是关键字还是内建命令,也可用来定位同名的系统命令
    148 unset                    删除用户变量
    149 
    150 http://www.cnblogs.com/fly-xiang-zhao/p/3708944.html
    151 
    152 
    153 
    154 || &&
    155 逻辑与 逻辑或
    156 
    157 | &
    158 管道 后台运行程序
    159 
    160 ;
    161 分隔命令,界限符
    162 
    163 
    164 继续上一行的命令
    165 
    166 $()
    167 count=$(ls | wc -l)            执行命令,将一个命令的执行结果赋给一个变量
    168 
    169 (())
    170 ((l=$m+$n))                数学运算,结果是5,()中要求必须包含=171 
    172 $(())
    173 l=$(($m+$n))                数学运算,结果是5,要求()中不包含=174 
    175 $[]
    176 line=$[$line+1]                数学运算
    177 
    178 []
    179 test conditon( [condition] ):                    [ ] 是一个命令,和比较内容要用空格隔开,多个比较条件使用多个 test 语句( [ $a = "a" ] &&/|| [ $b = "b" ]
    180 
    181 
    182 
    183 数字比较
    184 -eq ne gt ge lt le;
    185 bash shell 仅能处理整数;浮点数可以正常的输出,但是不能在基于数字的函数中工作。
    186 
    187 
    188 字符串比较
    189 
    190 > < = != -n -z(使用 > < 符号时要转义,如 >,不然会被当作重定向符;且 test 和 sort 排序的规则不同,test 使用标准 ASCII 顺序,sort 使用系统本地化语言设置中定义的顺序,在 test 中大写字母小与小写字母;sort 则大写字母大于小写字母,排序是是从小到大)
    191 
    192 -n 字符串长度不为 0 执行
    193 -z 字符串长度为 0 执行
    194 
    195 
    196 文件比较
    197 
    198 -d                    存在且是目录
    199 -e                    是否存在
    200 -f                    存在且是文件
    201 -r                    存在且可读
    202 -s                    存在且非空
    203 -w                    存在且可写
    204 -x                    存在且可执行
    205 -O                    存在且属于当前用户
    206 -G                    存在且默认组与当前用户相同
    207 file1 -nt file2                file1 比 file2 新
    208 file1 -ot file2                file1 比 file2 旧
    209 
    210 
    211 
    212 算术运算:expr delcare let bc(scale)
    213 
    214 expr
    215 通过给定的操作(参数必须以空格分开)连接参数, 并对参数求值. 可以使算术操作, 比较操作, 字符串操作或者是逻辑操作.在算术表达式expr中使用乘法操作时, 乘法符号必须被转义:expr 5 * 3.     y=`expr $y + 1`与let y=y+1和y=$(($y+1))的效果相同.
    216 expr `expr 3 + 4` * 5    运算符号和参数之间要有空格分开,*要转义或者 4 “*” 5;s = `expr 3 + 4`; $s = `expr $s * 5`;在shell中需要使用反引号来取得值。
    217 s= $[3 + 4]
    218 
    219 
    220 let 命令将执行变量的算术操作. 在许多情况下, 它被看作是复杂的expr命令的一个简化版本。
    221 let a=a+5 等价于 let "a = a + 5"  ;
    222 let "a -= 5" # 等价于 let "a = a - 5"          双引号和空格更具可读性
    223 let s= (3+4)*5 ( out of style )
    224 let "z += 3"                    使用引用的形式, 允许在变量赋值的时候存在空格
    225 
    226 使用后置引用的算术扩展(常和expr一起使用):z=`expr $z + 3`。
    227 使用双括号形式的算术扩展, 也可以使用 let 命令:后置引用形式的算术扩展已经被双括号形式所替代了 -- ((...))和$((...))
    228 z=$(($z+3))或 z=$((z+3)),(( n += 1 )),l
    229 
    230 
    231 declare raining=”1232 
    233 
    234 bc
    235 
    236 echo "obase=16; ibase=2; 11101101101100010" | bc
    237 echo "scale=4; 10/3" | bc
    238 
    239 GNU bc支持高精度数字和多种数值类型(例如二进制、十进制、十六进制)的输入输出。
    240 支持的操作符包括算术运算符(+, -, *, /, %, ++, --,^)、比较运算符(<, >, ==, !=, <=, >=)、逻辑运算符(!, &&, ||)、位运算符(&, |, , ~, <<, >>)和复合赋值运算符(+=, -=, *=, /=, %=, &=, |=, =, &&=, ||=, <<=, >>=)。bc内置了很多有用的函数,像是平方根、正弦、余弦、反正弦、自然对数、指数等。
    241 
    242 scale=3
    243 
    244 obase=16
    245 ibase=16            输入和输出的数系基分别存储在 ibase 和 obase 变量中,默认值为10,有效的数值是2到16(或者环境变量BCBASEMAX的值), obase=16 放到了 ibase=16 前面,反过来则是不可以的。这个是因为如果我先输入 ibase=16,那么随后输入的 obase=16 中的 16 会被认为是 16 进制的数字,也就是十进制的 22246 
    247 history                历史命令,默认 -1,没有限制
    248 
    249 sqrt(x)                外部的数学函数库来提供许多高级的数学函数,可以在命令行界面使用“-l”选项来打开 bc
    250 
    251 s(x)                sin
    252 
    253 c(x)                cos
    254 
    255 a(x)                反正弦
    256 
    257 l(x)                自然对数
    258 
    259 e(x)                指数对数
    260 
    261 作为一个计算语言,GNU bc 支持简单的声明(变量赋值、中断、返回等)、复合语句(ifwhilefor loop等)和自定义函数。
    262 下面是一个简单的函数示例:
    263 define dummy(x){
    264     return(x * x);
    265 }
    266 dummy(9)
    267 81
    268 dummy(4)
    269 16
    270 
    271 quit
    272 
    273 
    274 
    275 declare和typeset:为变量赋予属性
    276 
    277     这两个命令是同一个命令的两个名字,可用设置shell变量的属性和值,属性列表如下
    278 
    279     -a   声明一个数组变量(array)
    280 
    281     -f   声明一个函数变量(function)
    282 
    283     -i   声明一个整形变量(integer)
    284 
    285     -r  声明一个只读变量(readonly)
    286 
    287     -x  声明一个全局变量(export)
    288 
    289 
    290 
    291 文件重定向
    292 
    293 
    294 使用文件描述符语法形如“ &2 ”;
    295 使用“ >> ”往文件中写数据时如果是空文件,那么这个符号没有作用。
    296 
    297 exec 1>outputfile                    将标准输出重定向到文件
    298 exec 0<inputfile                    从文件中获取输入
    299 
    300 exec 3>owndefine
    301 echo hello >&3                        自定义文件描述符
    302 
    303 exec 3>>appendfile                    追加文件
    304 
    305 exec 3>&1
    306 exec 1>tmpfile
    307 exec 1>&3
    308 
    309 exec 6<&0
    310 exec 0<tmpfile
    311 exec 0<&6
    312 
    313 exec 3>&-                        关闭文件描述符
    314 
    315 
    316 读写文件描述符
    317 
    318 exec 3<>file
    319 read line <&3
    320 echo $line >&3
    321 
    322 
    323 
    324 捕捉信号
    325 
    326 trap "echo 'bye'; exit" SIGINT SIGTERM
    327 
    328 
    329 
    330 函数
    331 
    332 function name{}
    333 name()                        # 调用函数使用“ name ”,单独一行
    334 {
    335     echo "hello, I'm Michael. this is a function! how to exclude a function? it's same as a command( no '$' )."
    336 }
    337 name()                        # 带参数的函数使用方法“ name $value 10 ”,必须在一行,而且它不能直接从脚本的命令行获取参数哦,函数自身相当于一个脚本中的脚本啦
    338 {
    339     if [ $# -eq 2 ]
    340     then
    341         echo $[ $1 + $2 ]
    342     fi
    343 }
    344 
    345 函数定义必须在使用前面。
    346 函数名必须是唯一的,新定义的函数会覆盖前面的函数。
    347 默认情况下函数的退出码是最后一条命令的状态码,可以使用 return num 来决定退出码,为了避免问题,要在函数一结束就取状态码,状态码要在 0255 之间。
    348 脚本中定义的变量默认都是全局变量,如果函数想使用局部变量必须在声明变量时使用 local 前缀。
    349 
    350 
    351 
    352 正则表达式
    353 
    354 
    355 BRE 模式
    356  . ^ $ * []
    357 
    358          转义字符
    359 ^        锚字符,锁定行首;不在行首出现时就是排除字符“ [^s] ”
    360 $        锚字符,锁定行末
    361 .        必须匹配单字符
    362 *         前面的字符出现0次或多次。u*表明u可能没有出现,也可能出现多次。.*表明这里出现多个字符或没有字符
    363 []        字符组 [hel],必须匹配单字符。[^hel] 反转字符,[hell]*匹配多次;[0-9],[a-ch-m]
    364 
    365 特殊字符组
    366 [[:alpha:]]    匹配任意字母字符
    367 [[:alnum:]]    匹配任意字母数字
    368 [[:blank:]]    匹配空格或制表符
    369 [[:digit:]]    匹配0~9之间的数字
    370 [[:lower:]]    匹配小写字母
    371 [[:print:]]    匹配任意可打印字符
    372 [[:punct:]]    匹配标点符号
    373 [[:space:]]    匹配任意空白字符:空格、制表符、NL、FF、VT、CR
    374 [[:upper:]]    匹配任意大写字母
    375 
    376 
    377 扩展正则表达式
    378 ? + {} | ()
    379 ?        前面的字符出现0次或1次
    380 +        前面的字符出现1次或多次
    381 {}        区间,{1,3},前面的字符出现1次到3次
    382 |        管道,逻辑或的方式判断要用的多个模式
    383 ()        聚合符合;Sar(urday)? 匹配 Sar 或 Sarurday
    384 
    385 
    386 应用
    387 
    388 ^([a-zA-Z0-9_-.+]+)@([a-zA-Z0-9_-.]+).(a-zA-Z]{2,5})$                匹配邮箱地址,用户名可由字母数字、点号、加号、破折号、下划线组成,服务器名和域名可由字母数字、点号、下划线组成,顶级域名只能是字母(不少于两个,不多于五个)
    389 
    390 
    391 
    392 examples
    393 
    394 
    395 SCRIPT=$(readlink -f $0);BASEDIR=$(dirname $SCRIPT); echo $BASEDIR            获取执行命令的值( "$0" is same )
    396 
    397 cat <<EOF
    398 if [ -f  ${config_directory}/custom.cfg ]; then
    399   source ${config_directory}/custom.cfg
    400 elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
    401   source $prefix/custom.cfg;
    402 fi
    403 EOF
    404 
    405 
    406 
    407 问题
    408 
    409 
    410 shell执行后不会改变当前工作的目录。常用 shell 解释器有 sh, bash, csh, zsh。
    411 
    412 ${value}            有时候为了避免变量名和别的字符相混淆,最好养成习惯把变量名用“ {} ”括起来
    413 
    414 $readonly name=minmin        只读变量
    415 
    416 变量赋值时等号两边不能有空格。
    417 
    418 
    419 
    420 参考
    421 
    422 
    423 Linux Command Line and Shell Scripting Bible            Richard Blum  Christine Bresnahan
    424 http://laoxu.blog.51cto.com/4120547/1273840            shell 读取文件
  • 相关阅读:
    MySQL约束条件
    MySQL基本数据类型
    MySQL基本sql语句,存储引擎,创建表的语法,严格模式
    MySQL环境变量配置及系统服务制作,设置及修改密码,跳过授权表并重置密码,统一编码
    数据库及SQL语句由来,重要概念介绍,MySQL安装,启动服务端及连接,初识SQL语句
    图书管理系统前端页面搭建
    Bootstrap组件2
    c#版工作流之流程发起(3)
    C#版工作流运行机制(1)
    c#版本工作流引擎状态机(2)
  • 原文地址:https://www.cnblogs.com/little-snake/p/4347863.html
Copyright © 2020-2023  润新知