您的位置:首页 > 运维架构 > Shell

shell编程知识点总结(一)

2013-04-01 07:46 543 查看
灵活的运用shell编程的技巧及相关知识会让我们的shell编程有很大的提高,所以基础知识还是很有必要去认真的学习的

脚本基本用法理解

脚本必须以#!开头 #!/bin/bash
# 注释行,不执行 除此外都是脚本的有效执行部分
执行一个脚本 ./first.sh   bash first.sh 或把当前路径添加到PATH中
反引号是命令的执行结果
then的前面要加分号,不加分号then放到下一行
bash 测试(-n –x)
测试脚本是否有语法错误 bash -n 脚本(模糊测试)
bash -x 脚本 (执行脚本):单步执行
exit:退出脚本
exit 后跟数值(0-255) 0是正确数值执行状态结果
如果脚本没有明确定义退出状态码,那么最后执行的一条命令的退出码就是脚本的退出码

变量

变量是内存空间,是命名的内存空间 内存:是编址的存储单元 进程:临时存储数据需要变量
变量名称
只能包含字母、数字和下划线,并且不能以数字开头;
不应该跟系统中已有的环境变量重名
最好见名思意
变量类型:事先确定数据的存储格式和长度
数值
整型 :8bit :0-255
浮点型:11.13a  带小数点,带精度的
Shell变量问题(各种变量介绍—环境,本地,特殊等)
与:只要一个为假结果一定为假
shell弱类型编程语言
强:变量在使用前,必须事先声明,甚至还需要初始;
弱:变量用时声明,甚至不区分类型

变量赋值:VAR_NAME=VALUE
bash变量类型对变量的作用范围以及变量本身的表示形式分类
环境变量:(当前shell进程以及子shell进程)
本地变量(局部变量):当前shell进程
位置变量:$1,$2,....是位置变量
shift:轮替,可以隔开显示 shift可以剔除前n个参数
特殊变量:$? $#:参数的个数
$*:参数列表 “$*”
$@:参数列表  “$@”
本地变量
引用变量:${},括号可以省略
如果变量后加有字符时需花括号
内部有变量需替换时用双引号否则用单引号
局部变量
localVARNAME=VALUE:作用域为当前代码段
环境变量:
作用域为当前shell进程及其子进程。
export VARNAME=VALUE
导出变量:export VARNAME=VALUE 定义的时候直接导出
VARNAME=VALUE先定义再用 export VARNAME 导出
脚本在执行时会启动一个子shell进程:
命令行中启动的脚本会继承当前shell环境变量
系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量
程序执行后可能有两类返回值
$? :保存上一个命令的执行状态返回值
1 程序执行结果
2 程序状态返回代码(0-255)
0: 正确执行
1-255:错误执行  1,2,127(只是系统预留的有特殊意义,其他的用户可自己定义)

查看当前shell的变量
Set
(不带任何参数与选项的set命令)
查看当前shell的环境变量:
printenv
env
export
脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序
Export
export  PATH=$PATH:/usr/local/apache/bin在其后添加路径
export PATH=/usr/local/mysql/bin:$PATH
撤消变量;
unset VARNAME撤消变量 不加$符

条件测试的表达式

字符测试
==两个等于号或者一个= 前后要有空格两端有空格,否则是赋值;相等为真,不等为假
!= :测试是否不等于,不等为真,否则为假
>:大于 一个字符串是否大于另一个字符串
<:小于一个字符串是否小于另一个字符串
-n string:测试指定字符串是否为空,空则真,不空则假
id  –n  –u == id  –n  -g 比较两个字符串是否一样
-z string:测试指定字符串是否不空,不空为真,空则为假
整数比较
-eq:测试两个整数是否相等 例如:$A -eq $B (等值比较) 相等为真,不等为假
-ne:测试两个整数是否不等,不相等为真,相等为假
-gt:测试一个数是否大于另一个数;大于为真,否则为假
-lt:测试一个数是否小于另一个数;小于为真;否则为假;
-ge:大于或等于
-le:小于或等于
文件测试
-e:后跟文件名或者文件的路径(测试文件是否存在) [ -e /etc/inittab ]
-f:测试文件是否为普通文件 后跟文件名或路径      [-f FILE]
-d: 测试指定路径是否为目录 (后跟文件路径)    [-d FILE]
-r -w -x :测试指定文件对当前用户是否有读写执行权限
[ -x /etc/rc.d/rc.syinit ] 测试是否可执行

逻辑关系

逻辑与:
如果其中一个为假,结果一定为假 符号:&&
第一个条件为假时,第二个条件不用再判断,最终结果已经有了
第一个条件为真时,第二个条件必须得判断
逻辑或:
如果一个为真,结果一定为真 符号:||
例如:如果用户存在,就显示用户已存在;否则,就添加此用户;
id user1 && echo “user1 exit。“ || useradd user1

如何进行算术运算

let
let I+=1 相当于 let I++
-=:let I=1 相当于 let I++
*=乘等
/=除等
%=对一个数取模后再把余数附加给自己
如 I=14    I%=3就是I除以3后余2此时变量I的值就是2
算术表达式类型
1、let 算术运算表达式
let C=$A+$B
2、$[算术运算表达式]
3、 $((算术运算表达式))
C=$(($A+$B))
4、 expr 算术运算表达式,表达式中各操作数及运算符之间要有空格 而且要使用命令引用
C= `expr $A + $B`

条件判断语句

if
控制结构
单分支的if语句
if 判断条件;then
statement1
statement2
.......
fi
例如:if grep “^$username\>” /etc/passwd; then  :这其中的if直接取得的是命令的执行状态值 if可自己识别 if [ ! -e $file ], then echo "No $file." exit 8
双分支的判断语句
if判断条件: then
statement1
statement2
else
statement3
statement4
......
fi
多分支的if语句
if 判断条件1;then
statement1
....
elif 判断条件2; then
statement2
.....
elif 判断条件3; then
statement3
.......
else
statement4
......
fi
case语句
选择结构
case SWITCH in
valuel)
statement
....
;;
value2)
statement
....
;;
esac
循环
循环:进入条件,退出条件
for 变量 in 列表; do
循环体
done
例如:
for I in 1 2 3 4 5 6 7; do
加法运算
done
遍历完成之后,退出;

引用变量或变量中的字符长度

如:A=start ------判断A有多少个字符
echo ${#A} :引用变量名的长度(#号表示变量中所包含字符串的长度)
${#VARNAME}:就可以取字符串的长度
例如:
stty -F /dev/console size:可以查看物理终端一屏有多少行多少列
stty -F /dev/console size | awk '{print $2}' :可以取出一屏有多少列
也可以写成:A=`stty -F /dev/console size`  ——>  echo ${A#*  }
还可以写成:stty -F /dev/console size | cut –d’ ‘  -f2
echo ${A#*  }:表示从左往右找,找到第一个以空格为分隔符的把左侧的去了
echo ${A##*  }:从左往右找,找到最后一个空格,把前面的去了
这两种分隔符的不同之处就是第一个空格为分隔符和最后一空格为个分隔符
还有与之相反的一个

变量赋值

${parameter:-word}:如果parameter为空或未定义,则变量展开为“word”;否则,展开为parameter的值;
${parameter:+word}:如果parameter为空或未定义,不做任何操作;否则,则展开为“word”值;
${parameter:=word}:如果parameter为空或未定义,则变量展开为“word”,并将展开后的值赋值给parameter;
${parameter:offset}
${parameter:offset:length}:取子串,从offset处的后一个字符开始,取lenth长的子串;
A=3 echo ${A:-39} 结果是:3
uset A echo ${A:-30 结果是:3

经常使用的小方面

数据黑洞
/dev/null:软件设备,软件模拟设备 bit bucket(数据黑洞)
id student $> /dev/null
read 后跟变量 read -p选项 ”PEOMPT“:变量1 变量2 -p后跟是echo输出相同 -t 设置超时

知识点还不够全面,当学习到新的知识点时,会继续追加的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell编程