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: 词法分析:命令,选项,参数 内建命令: 外部命令 ...
随机推荐
- vim 使用技巧
2014-11-22 更新 文件abc 1,需要编辑abc的第三行 vim +3 abc 2,需要查询abc文件中的test字符 vim +/test abc 3,创建三个文件 aa bb cc vi ...
- sql事务和锁
摘自:http://www.cnblogs.com/lxconan/archive/2011/10/20/sql_transaction_n_locks_1.html 最近在项目中进行压力测试遇到了数 ...
- ECshop安装及报错解决方案总结
一.安装ECshop ECShop是一款B2C独立网店系统 ,适合企业及个人快速构建个性化网上商店.系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序.2006年3月推出以来1.0版以来, ...
- linux 下安装tomcat
1.把安装包放到 tomcat的目录, 2.然后 解压 tar -zxvf apache-tomcat-7.0.70.tar.gz 解压. 3.然后启动tomcat
- C 语言 homework(2)
<C语言程序设计>实验报告 学 号 160809215 姓 名 韩笑 专业.班 计科16-2班 学 期 2016-2017 第1学期 指导教师 黄俊莲 吴喆 实验地点 C区二层机房 机 器 ...
- log4j 配置
给java项目添加log4j日志: 1.下载log4j jar包,放入lib目录, 导入项目中 2.创建log4j.properties 文件 目录 Src 3.在需要使用输出的类中使用 priva ...
- OSI参考模型与TCP/IP协议模型
OSI和TCP/IP都是为了计算机之间更好的互联的. 计算机网络是一个复杂的系统,比如两台计算机进行通信不仅仅只是有一条通信线就可以了. 还有很多的工作需要完成,例如: 如何知道对方计算机是否做好准备 ...
- Android列表控件ListView详解
ListView绝对可以称得上是Android中最常用的控件之一,几乎所有应用程序都会用到它. 由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示的时候 ...
- CCF 模拟B 无脑循环+输入输出外挂
http://115.28.138.223:81/view.page?opid=2#code 代码一有WA点80分 #include<iostream> #include<cstdi ...
- PyCharm 5 破解注册方法
方法: 调整时间到2038年. 申请30天试用 退出pycharm 时间调整回来即可. 或者: 注册时选择 License server ,填 http://idea.lanyus.com ,然后点击 ...