|
编程能力:
脚本编程
编程语言:机器语言,汇编语言,高级语言
高级语言:
静态语言:编译型语言
不需要借助额外的二进制,需要一个编译器,直接转换为二进制运行的。
强类型(变量):变量在使用前, 必须事先声明,甚至还需要初始化
关键字:
事先转换成可执行格式
c、c++、java、c#
动态语言:解释型语言 on the fly
弱类型语言:变量随时(用时)声明,不区分类型
边解释边执行
asp asp.net php shell python perl
面向过程:shell ,c,perl,
面积对象:java,python,perl,c++
变量类型:直接决定了变量的储存格式,用来确定数据的存储格式和长度
字符
数值
时期
真假型
逻辑运算:与(乘)、或、非、异或
1:真
0:假
1&0=0
0&1=0
0&0=0
1&1=1
或:只一一个为真就为真,同时为假就为假
非:!真=假 !假=真
异或:操作数相同者为假, 不同者为真,相同者为零,否者为1
与:只要有一个为假,结果为假
或:只要有一个为真,结果为真
整形
浮点型 11.23 1.123*10^1 | 0.1123*10^2
变量:内存空间,命名的内存空间,
变量名称:
1、只能包含字母,数字,下划线,并且不能数字开头。
2、不应该跟系统中已有的环境变量重名。
3、最好做到见名知义
内存:编址的存储单元
进程:
Bash变量类型:
引用变量:${VARNAME},默认{}可以省略,例:
ANIMAL=pig
echo "There are some ${ANIMAL}s."
1、环境变量:
作用域为当前shell进程及其子进程
exprot VARNAME=VALUE "导出"
脚本在执行时使用时会启动一个子shell进程
命令行启动的脚本会继承当时shell环境变量;
系统自动执行的脚本(非命令行启动)就需要自我定义需要的各环境变量
2、本地变量(局部变量)
bash:进程的变量
VARNAME=VALUE,本地变量,作用域为整个bash进程有用;
local VARNAME=VALUE,局部变量,作用域为当前代码段
3、位置变量
$1,$1,$2......
4、特殊变量(Bash内置的,也称系统变量)
是为了保存特殊数据的,例:$?:上一个命令的执行状态返回值;
程序执行结果
程序状态返回代码(0-255)
0:正确执行
1-255:错误执行,1,2,127系统预留:
撤消变量:
unset VARNAME
查看当前shell中变量:
set (包括环境变量和本地变量)
查看当前shell中的环境变量:
printenv
env
export
一个变量对应多个值:
ANIMAL=pig:dog:goat 或者:ANIMAL=$ANIMAL:pig
输出重定向:
>
>>
2>
2>>
&> 同时重定向
/dev/null
id student &> /dev/null
脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序
#!/bin/bash
#注释行,不执行
Bash中如何实现条件判断?
条件测试类型:
1、整数测试
2、字符测试
3、文件测试
条件测试的表达式:
[ expression ] 命令
` expression ` 关键字
test expression
整数比较:
需要两个操作数
-eq:测试两个整数是否相等,比如:$A -eq $B
[ $A -eq $B ]
-ne:测试两个整数是否不等,不等为真,相等为假
-gt:测试一个数是否大于另一个数,大于为真,否则为假
-lt:测试一个数是否小于另一个数,小于为真, 否则为假
-ge:大于或
-le:小于或等于
命令间的逻辑关系:
逻辑与:&&> 第一个条件为假时,第二个条件不用判断,最终结果已经有了。
第一个条件为真时,第二个条件必须得判断
逻辑或:||
!id user6 && useradd user6 前面为假就不执行,为真就执行
id user6 || useradd user6 如果前面为真就不执行,为假就执行
如果用户存在,就显示用户已存在,否则就添加此用户:
id user1 && echo "use1 exists" || useradd user1
如果用户不存在,就添加,否则显示其已经存在
!> 如果用户不存在,添加并且给密码,否则,显示其已经存在;
!id user1 && useradd user1 && echo "user1" | passwd --stdin user1 || echo "user1 exists"
例:
#!/bin/bash
!id user1 &> /dev/null && useradd user1 && echo "user1" | passwd --stdin user1 &> /dev/null || echo ""user1 exists."
!id user2 &> /dev/null && useradd user2 && echo "user2" | passwd --stdin user2 &> /dev/null || echo ""user2 exists."
!id user3 &> /dev/null && useradd user3 && echo "user3" | passwd --stdin user1 &> /dev/null || echo ""user3 exists."
USERS=`wc -l /etc/passwd | cut -d'' -f1
echo "$USERS users"
#!/bin/bash
NAME=user1
USERID=`id -u $name`
[ $USERID -eq 0 ] && echo "This is root" || echo "This is not root"
条件判断,控制结构
单分支if语句:
if判断条件;then
statement1
statement2
...
fi
例:
#!/bin/bash
NAME=user1
if> ehco "$NAME exists."
fi
双分支的if语句:
if 判断条件;then
statement1
statement2
...
else
statement1
statement2
...
fi
例:
#!/bin/bash
NAME=user1
if> ehco "$NAME exists."
else
echo "$NAME not exist"
fi
#!/bin/bash
NAME=root
if [ `id -u $NAME` -eq 0 ]; then
echo "This is Admin"
else
echo "This is not Admin"
fi
shell运算:
方法一:let
$A=3
$B=6
let C=$A+$B
echo $C
方法二:
A=3
B=6
$[算术运算表达式]
C=$[$A+$B]
echo $c
方法三:
$((算术运算表达式))
C=$(($A+$B))
方法四:expr 算术表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
c=`expr $a + $b `
let 算法公式:
1、 let I+=1,相当于let I++(只有每次+1,才能写成++)
$I=10
let I+=1
echo $I
11
I=10
let I++
echo $I
11
2、
-=
let I-=1 相当于 let I--
++I ,--I
*=
/=
%=
I=14
let $I%=3
echo $I
2
#!/bin/bash
#
declare -i EVENSUM=0
declare -i ODDSUM=0
for I in {1..100};do
if [ $[$I%2] -eq 0 ];then
let EVENSUM+=$I
else
let ODDSUM+=$I
fi
done
echo "Even sum is $EVENSUM"
echo "ODD sum is $ODDSUM"
exit:退出脚本
文件测试:
-e FILE:测试文件存在
-f FILE:测试文件是否为普通文件;、
-d file:测试指定路径是否为目录。
-r file :测试当前用户对指定文件是否有读权限
-w file:写
-x file:执行
if [ -e /etc/inittab ] ,[ -x /etc/rc.d/rc.sysinit ]
多分支的if语句
if 判断条件1;then
statement1
....
elif 判断条件2;then
statement2
...
elif 判断条件3;then
statement3
...
else
statement4
fi
测试脚本是否有语法错误:
bash -n file 测试语法错误
bash -x file 单步执行,排错手法
bash变量类型:
本地变量
环境变量
位置变量:
$1,$2...
shift (轮换)
例:#!/bin/bash
echo $1
shift
echo$1
shift
echo$1
# ./filename 1 2 3
特殊变量:
$?
$# 参数的个数
$* 参数列表
$@ 参数列表
#!/bin/sh
if [ $# -lt 1 ]; then
echo 'Usage: ./filename.sh ARG1 [ARG2...]'
exit 9
fi
if [ -e $1 ];then
echo 'OK'
else
echo 'no such file'
fi
echo '$[$1+$2]' 可以直接引用到这样的格式。
|
|
|