bash脚本编程之一 变量、变量类型等
shell编程:
编程语言:机器语言、汇编语言、高级语言
高级语言:
静态语言:编译型语言
强类型语言(变量):变量在使用前,必须事先声明,甚至还需要初始化;
NULL
事先转换成可执行格式
eg,C,C++,JAVA,C#
动态语言:解释型语言,on the fly
通常弱类型语言:变量用时声明,甚至不区分类型(一般默认为字符串)
边解释边执行
eg,PHP,SHELL,python,perl
面向过程:Shell,C
面向对象:JAVA,Python,perl,C++
变量:内存空间,命名
变量赋值:VAR_NAME=VALUE 将值存储在变量所定义的存储空间中
内存:编址的存储单元
变量类型:用来事先确定数据的存储格式和长度
字符
数值:
整形
浮点型
计算机怎么保证每一个变量都是正确的?
申明一个变量为整形,并且申请一个字节,在里面保存256,最终结果是什么?
溢出:只保留后面00000000,溢出的数据可能会占用其它进程的空间,覆盖其它进程的数据
强类型语言(变量):变量在使用前,必须事先声明,甚至还需要初始化;
通常弱类型语言:变量用时声明,甚至不区分类型(一般默认为字符串)
变量赋值:set(set可略) VAR_NAME=VALUE 将值存储在变量所定义的存储空间中
bash变量类型:
环境变量
本地变量(局部变量)
位置变量
特殊变量
本地变量:在用户现在的shell生命期的脚本中使用
本地变量:VARNAME=VALUE:作用域为整个bash进程
局部变量:local VARNAME=VALUE:作用域为当前代码段
环境变量:作用域为当前shell进程及其子进程
export VARNAME=VALUE
=:VARNAME=VALUE
export VARNAME
脚本在执行时会启动一个子shell进程
命令行中启动的脚本会继承当前shell环境变量
系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量
eg

当在命令行中再启动一个shell时,变量仍然在子shell中有效
位置变量:以后用到脚本编程的时候再讲
特殊变量:保存某些特殊数据
$?:保存上一个命令的执行状态返回值
程序执行以后,可能有两类返回值
程序执行结果
程序状态返回代码(0-255)
0:正确执行
1-255:错误执行,1,2,127系统预留
输出重定向:/dev/null中
>:覆盖重定向
>>:覆盖追加重定向
2>:错误重定向
2>>:错误追加重定向
&>:正确、错误重定向
/dev/null:软件设备,bit bucket,数据黑洞
撤消变量:unset VARNAME
撤消变量值:unset $VARNAME
查看当前shell中所有变量
set
查看当前 shell 中的环境变量:
printenv
env
export
脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的机制
Shebang:!#
#注释行,不执行
Shebang这个符号通常在linux系统的脚本中第一行开头中写到,它指明了执行这个脚本文件的解释程序
1、如果脚本文件中没有#!这一行,那么它执行时会默认用当前Shell去解释这个脚本(即:$SHELL环境变量)
2、 如果#!之后的解释程序是一个可执行文件,那么执行这个脚本时,它就会把文件名及其参数一起作为参数传给那个解释程序去执行。
3、如果#!指定的解释程序没有可执行权限,则会报错“bad interpreter: Permission denied”。如果#!指定的解释程序不是一个可执行文件,那么指定的解释程序会被忽略,转而交给当前的 shell 去执行这个脚本。
4、 如果#!指定的解释程序不存在,那么会报错“bad interpreter: No such file or directory”。注意:#!之后的解释程序,需要写其绝对路径(如:#!/bin/bash),它是不会自动到 $PATH 中寻找解释器的。
5、当然,如果你使用 bash test.sh 这样的命令来执行脚本,那么#!这一行将会被忽略掉,解释器当然是用命令行中显式指定的 bash。
bash:
引用变量:${VARNAME} ,{}在大多数时候可以省略
eg遇到会导致变量名混淆的时候,需加{}

此时计算机会认为ANIMALs是变量名,而ANIMALs并没有给其赋值,所以为空

加上{}这个问题就能解决
浙公网安备 33010602011771号