shell 脚本编程概述
- 环境变量
- ? 退出状态码 (成功) (未知错误) (误用 shell 命令) (命令不可执行) (没找到命令) (无效退出状态) +x( linux 信号 X 的严重错误) ( ctrl c 终止程序 ) (退出状态码越界)
- # 命令行参数个数
- @ 以“参数1”“参数2”...形式保存所有参数
- * 以“参数1 参数2...”形式保存所有参数
- $ 本程序的 PID
- ! 上一个命令的 PID
- 当前程序文件名
- n 命令行参数,第 n 个参数,$ 表示文件名
- LANG 当前语言环境,zh_CN.utf8
- SHELL 当前的命令解释器
- PATH 命令搜索路径,以冒号为分隔符,注意与DOS下不同的是,当前目录不在系统路径里
- HOME 用户home目录的路径名,是cd命令的默认参数
- COLUMNS 命令编辑模式下可使用的命令行的长度
- EDITOR 默认的行编辑器
- VISUAL 默认的可视编辑器
- FCEDIT 命令fc使用的编辑器
- HISTFILE 命令历史文件
- HISTSIZE 命令历史文件中最多可包含的命令条数
- IFS 定义 shell 使用的分隔符,指定了在命令行中用来分隔参数的字符,其默认值为空格,制表符和换行符。但无论IFS的值是什么,用户总是可以使用空格符和制表符来分隔参数;
- LOGNAME 用户登录名
- MAIL 保存邮件的位置
- MAILCHECK shell检查MAIL文件的周期,单位是秒
- MAILPATH 功能与MAIL类似,但可以是一组文件,以冒号分隔
- RANDOM 小于等与 位数的随机数
- SHELL shell的路径名
- TERM 终端的类型
- TMOUT shell自动退出的时间,若为0则禁止shell自动退出
- PS1 主命令提示符
- PS2 二级命令提示符,命令执行过程中要求输入数据时用
- PS3 select的命令提示符
- PS4 调试命令提示符
- MANPATH 寻找手册页的路径,以冒号分隔
- LD_LIBRARY_PATH 寻找库的路径,以冒号分隔
- 自定义环境变量不能以数字开头,文件路径不用使用转义字符。
- export 导出全局变量
- Bash 执行命令的优先级:
- 别名 关键字 函数 内建命令 脚本或可执行程序($PATH)
- shell 基本语法:
- 关键字(由 bash 解释):if elif else (for in) then test until while case break continue echo clear let read
- if then...elif then......fi( if then...else...fi )
- while [condition] do...done
- for value in "hel" "hello" "world"...do...done
- case $value in...a)...;;b)...;;esac
- if-then 高级特性
- 双尖括号 (())
- 双方括号 [[]]
- ”]
- then
- echo “Hello, Bob”
- ”]
- then
- echo “hello, Mary”
- ”]
- then
- echo “hello, Joan”
- ”]
- then
- echo “hello, Mike”
- ”]
- then
- echo “hello, Tom”
- fi
- let flag=
- ]
- do
- for friend in Bob Mary Sue
- do
- echo “hello, $friend”
- done
- let flag=”$flag + ”
- done
- for friend in “Mary” “Joe” “Sue”
- do
- echo “hello, $friend”
- done
- for CPUFREQ in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do [ -f $CPUFREQ ] || continue; echo -n performance > $CPUFREQ; done
- case $region in
- )
- echo “Hello, Bob”
- ;;
- )
- echo “Hello, Mary”
- ;;
- )
- echo “Hello, Joan”
- ;;
- )
- echo “Hello, Mike”
- ;;
- *)
- echo “Hello, Tom”
- ;;
- esac
- 内建命令
- bash
- : . [
- alias
- bg bind break builtin
- caller cd command compgen complete compopt continue
- declare dirs disown
- echo enable eval exec exit export
- false fc fg
- getopts
- hash help history
- jobs
- kill
- let local logout
- mapfile
- popd printf pushd pwd
- read readonly return
- set shift shopt source suspend
- test times trap true type typeset
- ulimit umask unalias unset
- wait
- dirs 显示目录栈
- history HISTSIZE 会话期间保存的历史命令的条数,HISTFILESIZE 会话之间保存的历史命令的条数,HISTFILE 历史文件的位置
- source 从文件中读取命令并执行,不管文件是否是脚本文件
- type [cmd] 给出 cmd 的完整路径;-a 鉴别参数是关键字还是内建命令,也可用来定位同名的系统命令
- unset 删除用户变量
- http://www.cnblogs.com/fly-xiang-zhao/p/3708944.html
- || &&
- 逻辑与 逻辑或
- | &
- 管道 后台运行程序
- ;
- 分隔命令,界限符
- \
- 继续上一行的命令
- $()
- count=$(ls | wc -l) 执行命令,将一个命令的执行结果赋给一个变量
- (())
- ((l=$m+$n)) 数学运算,结果是5,()中要求必须包含=号
- $(())
- l=$(($m+$n)) 数学运算,结果是5,要求()中不包含=号
- $[]
- line=$[$line+] 数学运算
- []
- test conditon( [condition] ): [ ] 是一个命令,和比较内容要用空格隔开,多个比较条件使用多个 test 语句( [ $a = "a" ] &&/|| [ $b = "b" ]
- 数字比较
- -eq ne gt ge lt le;
- bash shell 仅能处理整数;浮点数可以正常的输出,但是不能在基于数字的函数中工作。
- 字符串比较
- > < = != -n -z(使用 > < 符号时要转义,如 \>,不然会被当作重定向符;且 test 和 sort 排序的规则不同,test 使用标准 ASCII 顺序,sort 使用系统本地化语言设置中定义的顺序,在 test 中大写字母小与小写字母;sort 则大写字母大于小写字母,排序是是从小到大)
- -n 字符串长度不为 执行
- -z 字符串长度为 执行
- 文件比较
- -d 存在且是目录
- -e 是否存在
- -f 存在且是文件
- -r 存在且可读
- -s 存在且非空
- -w 存在且可写
- -x 存在且可执行
- -O 存在且属于当前用户
- -G 存在且默认组与当前用户相同
- file1 -nt file2 file1 比 file2 新
- file1 -ot file2 file1 比 file2 旧
- 算术运算:expr delcare let bc(scale)
- expr
- 通过给定的操作(参数必须以空格分开)连接参数, 并对参数求值. 可以使算术操作, 比较操作, 字符串操作或者是逻辑操作.在算术表达式expr中使用乘法操作时, 乘法符号必须被转义: \* . y=``与let y=y+1和y=$(($y+))的效果相同.
- + ` \* 运算符号和参数之间要有空格分开,*要转义或者 “*” ;s = ` + `; $s = ``;在shell中需要使用反引号来取得值。
- s= $[ + ]
- let 命令将执行变量的算术操作. 在许多情况下, 它被看作是复杂的expr命令的一个简化版本。
- let a=a+ 等价于 let "a = a + 5" ;
- let "a -= 5" # 等价于 let "a = a - 5" 双引号和空格更具可读性
- let s= (+)* ( out of style )
- let "z += 3" 使用引用的形式, 允许在变量赋值的时候存在空格
- 使用后置引用的算术扩展(常和expr一起使用):z=``。
- 使用双括号形式的算术扩展, 也可以使用 let 命令:后置引用形式的算术扩展已经被双括号形式所替代了 -- ((...))和$((...))
- z=$(($z+))或 z=$((z+)),(( n += )),l
- declare raining=””
- bc
- echo "obase=16; ibase=2; 11101101101100010" | bc
- echo "scale=4; 10/3" | bc
- GNU bc支持高精度数字和多种数值类型(例如二进制、十进制、十六进制)的输入输出。
- 支持的操作符包括算术运算符(+, -, *, /, %, ++, --,^)、比较运算符(<, >, ==, !=, <=, >=)、逻辑运算符(!, &&, ||)、位运算符(&, |, , ~, <<, >>)和复合赋值运算符(+=, -=, *=, /=, %=, &=, |=, =, &&=, ||=, <<=, >>=)。bc内置了很多有用的函数,像是平方根、正弦、余弦、反正弦、自然对数、指数等。
- scale=
- obase=
- ibase= 输入和输出的数系基分别存储在 ibase 和 obase 变量中,默认值为10,有效的数值是2到16(或者环境变量BCBASEMAX的值), obase= 放到了 ibase= 前面,反过来则是不可以的。这个是因为如果我先输入 ibase=,那么随后输入的 obase= 中的 会被认为是 进制的数字,也就是十进制的 。
- history 历史命令,默认 -,没有限制
- sqrt(x) 外部的数学函数库来提供许多高级的数学函数,可以在命令行界面使用“-l”选项来打开 bc
- s(x) sin
- c(x) cos
- a(x) 反正弦
- l(x) 自然对数
- e(x) 指数对数
- 作为一个计算语言,GNU bc 支持简单的声明(变量赋值、中断、返回等)、复合语句(if、while、for loop等)和自定义函数。
- 下面是一个简单的函数示例:
- define dummy(x){
- return(x * x);
- }
- dummy()
- dummy()
- quit
- declare和typeset:为变量赋予属性
- 这两个命令是同一个命令的两个名字,可用设置shell变量的属性和值,属性列表如下
- -a 声明一个数组变量(array)
- -f 声明一个函数变量(function)
- -i 声明一个整形变量(integer)
- -r 声明一个只读变量(readonly)
- -x 声明一个全局变量(export)
- 文件重定向
- 使用文件描述符语法形如“ & ”;
- 使用“ >> ”往文件中写数据时如果是空文件,那么这个符号没有作用。
- exec >outputfile 将标准输出重定向到文件
- exec <inputfile 从文件中获取输入
- exec >owndefine
- 自定义文件描述符
- exec >>appendfile 追加文件
- exec >&
- exec >tmpfile
- exec >&
- exec <&
- exec <tmpfile
- exec <&
- exec >&- 关闭文件描述符
- 读写文件描述符
- exec <>file
- read line <&
- 捕捉信号
- trap "echo 'bye'; exit" SIGINT SIGTERM
- 函数
- function name{}
- name() # 调用函数使用“ name ”,单独一行
- {
- echo "hello, I'm Michael. this is a function! how to exclude a function? it's same as a command( no '$' )."
- }
- name() # 带参数的函数使用方法“ name $value ”,必须在一行,而且它不能直接从脚本的命令行获取参数哦,函数自身相当于一个脚本中的脚本啦
- {
- ]
- then
- + $ ]
- fi
- }
- 函数定义必须在使用前面。
- 函数名必须是唯一的,新定义的函数会覆盖前面的函数。
- 默认情况下函数的退出码是最后一条命令的状态码,可以使用 return num 来决定退出码,为了避免问题,要在函数一结束就取状态码,状态码要在 ~ 之间。
- 脚本中定义的变量默认都是全局变量,如果函数想使用局部变量必须在声明变量时使用 local 前缀。
- 正则表达式
- BRE 模式
- \ . ^ $ * []
- \ 转义字符
- ^ 锚字符,锁定行首;不在行首出现时就是排除字符“ [^s] ”
- $ 锚字符,锁定行末
- . 必须匹配单字符
- * 前面的字符出现0次或多次。u*表明u可能没有出现,也可能出现多次。.*表明这里出现多个字符或没有字符
- [] 字符组 [hel],必须匹配单字符。[^hel] 反转字符,[hell]*匹配多次;[-],[a-ch-m]
- 特殊字符组
- [[:alpha:]] 匹配任意字母字符
- [[:alnum:]] 匹配任意字母数字
- [[:blank:]] 匹配空格或制表符
- [[:digit:]] 匹配0~9之间的数字
- [[:lower:]] 匹配小写字母
- [[:print:]] 匹配任意可打印字符
- [[:punct:]] 匹配标点符号
- [[:space:]] 匹配任意空白字符:空格、制表符、NL、FF、VT、CR
- [[:upper:]] 匹配任意大写字母
- 扩展正则表达式
- ? + {} | ()
- ? 前面的字符出现0次或1次
- + 前面的字符出现1次或多次
- {} 区间,{,},前面的字符出现1次到3次
- | 管道,逻辑或的方式判断要用的多个模式
- () 聚合符合;Sar(urday)? 匹配 Sar 或 Sarurday
- 应用
- ^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.(a-zA-Z]{,})$ 匹配邮箱地址,用户名可由字母数字、点号、加号、破折号、下划线组成,服务器名和域名可由字母数字、点号、下划线组成,顶级域名只能是字母(不少于两个,不多于五个)
- examples
- SCRIPT=$();BASEDIR=$(dirname $SCRIPT); echo $BASEDIR 获取执行命令的值( "$0" is same )
- cat <<EOF
- if [ -f \${config_directory}/custom.cfg ]; then
- source \${config_directory}/custom.cfg
- elif [ -z "\${config_directory}" -a -f \$prefix/custom.cfg ]; then
- source \$prefix/custom.cfg;
- fi
- EOF
- 问题
- shell执行后不会改变当前工作的目录。常用 shell 解释器有 sh, bash, csh, zsh。
- ${value} 有时候为了避免变量名和别的字符相混淆,最好养成习惯把变量名用“ {} ”括起来
- $readonly name=minmin 只读变量
- 变量赋值时等号两边不能有空格。
- 参考
- Linux Command Line and Shell Scripting Bible Richard Blum Christine Bresnahan
- http://laoxu.blog.51cto.com/4120547/1273840 shell 读取文件
shell 脚本编程概述的更多相关文章
- Linux Shell编程第1章——Shell脚本编程概述
目录 Linux和Shell简介 Linux是一套可免费使用和自由传播的类UNIX操作系统.Shell是一种具备特殊功能的程序,它提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令,并把它送 ...
- Linux Shell脚本编程-基础1
概述: shell脚本在Linux系统管理员的运维工作中非常重要.shell脚本能够帮助我们很方便的管理服务器,因为我们可以指定一个任务计划,定时的去执行某一个脚本以满足我们的需求.本篇将从编程基础 ...
- SHELL脚本编程-expect
SHELL脚本编程-expect 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.expect概述 1>.expect介绍 expect 是由Don Libes基于Tcl( ...
- SHELL脚本编程-普通数组(列表)和关联数组(字典)
SHELL脚本编程-普通数组(列表)和关联数组(字典) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数组相关概述 变量: 存储单个元素的内存空间 数组: 存储多个元素的连续的 ...
- SHELL脚本编程的条件测试
SHELL脚本编程的条件测试 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.条件测试概述 判断某需求是否满足,需要由测试机制来实现 专用的测试表达式需要由测试命令辅助完成测试过 ...
- Shell脚本编程30分钟入门
Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...
- Linux shell脚本编程(三)
Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...
- Linux shell脚本编程(二)
Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...
- Linux shell脚本编程(一)
Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...
随机推荐
- -bash: sudo: command not found Error and Solution
文章转自: http://www.cyberciti.biz/faq/debian-ubuntu-rhel-centos-linux-bash-sudo-command-not-found/ 安装su ...
- PostgreSQL表空间、数据库、模式、表、用户/角色之间的关系
看PostgreSQL9的官方文档,我越看越迷糊,这表空间,数据库,模式,表,用户,角色之间的关系怎么在PostgreSQL里这么混乱呢?经过中午的一个小实验,我逐渐理清了个中来龙去脉.下面我来还原我 ...
- js DOM Element属性和方法整理
节点操作,属性 1. childNodes.children 这两个属性获取到的子节点会根据浏览器的不同而不同的,所以一定要判断下nodeType是否为1. childNodes获取到的是NodeLi ...
- sql中的常见的全局变量
select APP_NAME ( ) as w --当前会话的应用程序 select @@IDENTITY --返回最后插入的标识值 select USER_NAME() --返回用户数据库用户名 ...
- svn搬移到gitlab及使用
svn是一款非常简便,易用的源代码管理工具,用了这么多年,对它情有独钟.都说习惯最难改,那为何要搬移到gitlab上呢? 喜欢尝试新东西,前提还是git比较强大,svn有的它都有,svn没有的它也有. ...
- session 的用法
</head> <body> <?php //session_start();//开启session,必须写在PHP代码最顶端 //HTTP,无状态性 //记录登陆者状态 ...
- MySQL Cluster 配置文件(config.ini)详解
MySQL Cluster 配置文件(config.ini)详解 ################################################################### ...
- Mac Pro 安装 cmake,报错 Warning: cmake-3.5.2 already installed, it's just not linked
1.先安装 brew,参考文章:Mac Pro 安装 Homebrew 软件包管理工具 2.执行安装命令 brew install cmake 出现警告提示: Warning: cmake-3.5.2 ...
- WPF:类型转换器的实现
类型转换器提供字符串文本到值的转换方法来帮助WPF设计时在XAML中配置属性.具体用法可以参考MSDN的文档:如何:实现类型转换器. 下面是一个Demo,参考自<葵花宝典--WPF自学手册> ...
- css3 github javascript
欢迎关注我的 github github博客地址 github地址