Linux入门之bash基础
编程语言分类: 机器语言、汇编语言、高级语言
静态语言:编译型语言
特点:
变量为强类型
实现转化为一定的可执行格式
常见:C、C++、JAVA、C#、Object-C
注意:一般需要解释器的编程语言一般为静态语言
动态语言:解释性语言
特点:
变量未弱类型,边解释边执行
常见: PHP、SHELL、python、perl
lua : 嵌入式脚步语言
编程语言的模型、思想分类
面向过程: shell,C
面向对象: java,python,perl,c++
一个变量的数据表示:
变量:命名的内存空间
内存:变量地址的存储单元
bash支持的引号:
``: 命令替换
"": 弱引用,可以实现变量替换
'': 强引用,不完成变量替换
补充:
不同类型的变量占用不同内存空间大小,例如
string 10: 占用16bit
int 10 : 占用8bit
变量类型:
字符 string
数值 number
×××: int
浮点型:float
布尔型 (true | false)
变量类型的作用:用来确定数据的存储格式的长度
数据溢出:
1、变量的数值会溢出,数据可能会丢失
2、使用程序判断来解决缓存去溢出 buffer,强类型语言会在编译器编译前事先检查
逻辑运算:与、或、非、异或
与:&
举例:如果用1表示true,0表示fasle
1: 真
0:假
1 & 0 =0
0 & 1 =0
0 & 0 =0
1 & 1 =1
或:|
true | false
false | true
非:!
!true = false
! false =true
异或
操作数相同为false,不同为true
shell: 弱类型语言
强弱类型变量区别
强:变量在使用前,必须事先声明,甚至还需要初始化
弱:变量可以在用时声明,甚至不区分类型
变量赋值:
直接使用:VAR_NAME=VALUE
随时用,随时声明,不许类型
centos linux默认为bash
bash变量类型:
环境变量
本地变量(局部变量)
位置变量 $1,$2...
特殊变量
本地变量:
作用域:当前shell进程
NAME=mzf
echo $NAME
在当前bash有效,
输入bash再次打开一个bash
echo $NAME
会发现变量值会空
引用变量
举例:
ANIMAL=pig 变量定义
[root@mzf testdir]# echo "There are is $ANIMAL"
There are is pig
[root@mzf testdir]# echo "There are is $ANIMALs"
There are is
这是$VAR_NAME格式就不适用了,需要加{}
[root@mzf testdir]# echo "There are is ${ANIMAL}s"
There are is pigs
[root@mzf testdir]# echo "There are is $(ANIMAL)s"
There are is pigs
局部变量
local VARNAME=VALUE 作用域为当前代码段
环境变量
作用域为当前shell进程及其子进程
定义方法(导出):
1、export VARNAME=VALUE 直接赋值并导出
2、VARNAME=VARLUE 这里的VARNAME为事先声明的
export VARNAME
举例:
输入以下命令
NAME=mzf
export NAME 导出
bash 再次打开子shell
echo $NAME 仍然输出
位置变量
$1,$2,......
特殊变量
S?: 上一个命令的执行状态返回值
0 : true 正确执行
1~255 : false 错误执行 (注:1,2,127为系统预留)
补充(在条件判断时时常不想想显示输出信息):
输出重定向:
> 标准输出
>> 追加输出
2> 错误输入
2>> 错误追加输出
&> 总是输出
/dev/null 软件设备,数据黑洞 : 用于丢弃输出的数据
撤销变量
unset VARNAME
查看当前shell中变量
查看所有变量,包裹环境变量和本地变量
set
查看当前shell的环境变量
export
env
printenv
用途举例:
ANIMALS=pig
ANIMALS=$ANIMALS:goat
暂时新增PATH路径
PATH=$PATH:/home/tom/helloword
比较运算符
bash中如何实现条件判断?
条件测试类型:
整数测试
字符测试
文件测试
条件测试的表达式:
[ expression ]
` expression ` (注意:这里不适合使用 -a 或 -o,会出错)
test expression
整数比较:
-eq: 测试两个整数是否相等;比如 $A -eq $B
-ne: 测试两个整数是否不等;不等,为真;相等,为假;
-gt: 测试一个数是否大于另一个数;大于,为真;否则,为假;
-lt: 测试一个数是否小于另一个数;小于,为真;否则,为假;
-ge: 大于或等于
-le:小于或等于
命令的间逻辑关系:
逻辑与(短路与): &&
第一个条件为假时,第二条件不用再判断;
第一个条件为真时,第二条件必须得判断;
条件都成立,结果为真;条件都不成立,结果为假
逻辑或(短路或): ||
第一个条件为假时,第二条件继续判断;
第一个条件为真时,第二条件无需判断;
条件有一个成立,结果为真;条件都不成立,结果为假
例子:
如果用户user6不存在,就添加用户user6
! id user6 && useradd user6 || echo "user: user6 is exists."
id user6 && echo "user: user6 is exists." || useradd user6
shell 如何进行算数运算?
1、let 算数运算符
let C=$A+$B
2、$[算数运算符]
C=$[$A+$B]
3、$((算数运算表达式))
$(($A+$B))
4、expr 算数运算符表达式,表达式中各操作及运算符之间要有空格
C=`expr $A + $B`
exit : 退出脚步
测试方法:
[ expression ]
` expression `
test expression
注意: 只有需要整数测试才需要使用 [ expression ] ,比如 [ $INT1 -eq $INT2 ]
例如:
判断用法是否存在
if grep "\<$USERNAME\>" /etc/passwd &> /dev/null; then
判断用法uid是否为0
if [ `grep "\<$USERNAME\>" /etc/passwd | cut -d: -f3` -gt 0 ]
文件测试:
-e FILE: 测试文件是否存在
-f FILE:测试文件是否为普通文件
-d FILE: 测试指定路径是否为目录
-r FILE: 测试当前用户指定文件是否有读取权限
-w FILE: 测试当前用户指定文件是否有写权限
-x FILE: 测试当前用户指定文件是否有执行权限
组合测试条件:
-a: 于关系
-o: 或关系
!: 非关系
例如:
[ -e /etc/inittab ] 注意 :[ -e ] 表示为 true ,没有路径任然为真
[ -x /etc/rc.d/rc.sysinit ]
测试脚步是否有语法错误
bash -n 脚步名称: 测试语法
bash -x 脚步: 单步执行 类似 debug
注意:一般输入的错误命令选项都会有Unknown(无法识别)这个单词
exit: 退出脚步
exit #
如果脚步没有明确定义退出状态码,那么最后执行的一条命令的状态码为退出状态码
echo $? 查看状态码
注意:只要脚步最后一天执行成功无论结果,exit默认为0,一般定义为错误退出码来执行非法退出
位置变量举例:
./filetest.sh /etc/fstab /etc/inittab
$1 : /etc/fatab
$2 : /etc/inittab
环境变量:
$1,$2,....
shift 变量s轮替,及第二个替换第一个,后面一个替换前面一个
特殊变量:
$? 状态返回值
$# 参数的个数
$* 参数列表
$@ 参数列表
字符测试:
== : 测试是否相等,相等为真,不等为假
!= : 测试是否不等,不等为真,相等为假
>: 比较字符的ASCII编码大小,是否大于
<:比较字符的ASCII编码大小,是否小于
-n string : 测试指定字符串是否为空,空则真,不空为假
-z string : 测试指定字符串是否不空,不空为真,空为假
生成列表:
1、使用{}
{1,..100} 表示 1~100
2、使用seq列表指定列表
seq [起始数 [步进长度]] 结束数
declare 声明变量
命令用法:
declare -i SUM=0 声明为int (整型) 类型
declare -x HOST=”local” 执行声明为环境变量,相等于export
declare -o Pai=”3.1415926” 声明为只读变量,也成常量
readonly VAR_NAME=VALUE 声明为只读变量,也成常量
export HOST=”local” 声明为环境变量
local AMI=”AMI” 声明为本地变量(局部变量)