变量类型:实现确定数据的存储格式和长度。
字符
数值
×××:
浮点型:
布尔型:
真(ture)
假(false)
逻辑运算:
与:&
或:|
非:!
短路逻辑运算:
与:只要一个为假,结果一定为假
或:只要一个威震,结果一定为真。
非:
引用:
强引用:
在变量使用前,一定要事先声明,甚至还需要初始化。变量在初始化前内容为一段随机数。
数值初始化为0。 字符串初始化为NULL。
弱引用:变量用时声明,不需要区分类型。
bash变量类别:
1.本地变量:
作用域为整个bash进程。仅对当前shell进程有效,对子shell无效。
#[set] [OPTION] VARNAME = VALUE
默认不带参数则显示当前shell中的变量。
例如:
#NAME=jerry 定义1个变量NANE,赋值jerry
#echo $NAME 输出变量NAME的值。
jerry
#bash 新建zishell
#echo $NAME 输出变量的值,无输出。
局部变量:
local VARNAME=VALUE 作用域为当前代码段。
例如:
#vim a.sh
#!/bin/bash
a=1
test(){
a=${3+4}
}
test()
for I in `seq $a 10`;do
echo $I
done
#bash a.sh
7
8
9
10
#vim a.sh
#!/bin/bash
a=1
test(){
local a=${3+4} 这里a变为局部变量
}
test()
for I in `seq $a 10`;do
echo $I
done
#bash a.sh
1
2
3
4
5
6
7
8
9
10
2.环境变量
是本地变量的一种,作用域为是当前shell进程及其子进程。
脚本在执行时会在当前shell进程中启动一个子进程:
命令行中启动的脚本汇集成当前shell的环境变量。
系统自动执行的脚本(非命令行启动)就需要自我定义需要的各环境变量。
#export [OPTION] VARNAME 把本地变量声明成环境变量。
#export VARNAME=VALUE
#declare -x VARNAME=VALUE
#export VARNAME1:$VARNAME2 将VARNAME1附加到VARNAME2里边。
例如:
#export PATH=/usr/local/apache/bin:$PATH
将/usr/local/apache/bin 添加到环境变量$PATH。
查看当前shell中的环境变量:
#printenv
#env
#exprot
系统常见环境变量:
$HOSTNAME
$SHELL
$HISTORY
$PWD
$OLDPWD
$USER
$PAHT
$PS1 定义提示符前的内容,默认PS1='[\u@\h \W}]\$'
\u 当前用户名
\H 完整的主机名
\h 完整主机名的第一个点前的内容
\W 显示basename,基名。
\w 显示完整路径
\# 显示命令号
\! 显示在命令历史中的序号
\$ UDI=0显示#,普通用户显示$
$PS2 第二个提示符,默认是>号。上个命令未结束。续行符号。
$PS3
$PS4 执行脚本追踪命令的时候显示+号
3.特殊变量
$? 用于引用前一个命令的执行状态的返回值。
$# 参数的个数。
$* 参数列表。
$@ 参数列表。
返回值:
linux中,真的值为0,其他值都为假。
1.程序自身执行结果的返回值。
2.程序执行状态的返回值(0-255)。
0 执行成功
1-255 执行失败,其中1、2、127被系统保留。
例如:
#ls /etc
#echo $?
0
#lss /et
#echo $?
127
#id student
#echo $?
0
#id student $> /dev/null
#echo $?
0
4.位置变量
$1,$2... 用来引用脚本的参数。
shift 参数的轮替。用后一个参数替代前一个参数。
例如:
#./test.sh /etc/fstab /etc/inittab
在test.sh这个脚本中,可以用$1代表/tec/fstab,用$2代表/etc/inittab
写一个脚本:
能接受一个参数:文件路径
判定:此参数如果是一个存在的文件,就显示ok,否则显示no such a file。
test.sh
#!/bin/bash
if [$# -lt 1];then
echo "useage: ./test.sh ARG1..."
eles
exit 7
if [ -e $1 ]; then
echo "ok"
else
echo "no such a file"
fi
shift.sh:
#!/bin/bash
echo $1
shift
echo $1
shift
echo $1
#bash shift.sh 1 2 3
1
2
3
写一个脚本:
给脚本传递2个参数(整数):
显示两者之和,之积。
#!/bin/bash
if [ $# -lt 2];then
echo "must 2"
exit8
fi
echo "the sum is $[$1+$2]."
echo "the prod is $[$!*$2]"
bash支持的引号
1.'' 单引号
强引用,引号中的内容原封不动输出。
2."" 双引号
弱引用,引号中的变量要进行变量替换。
3.`` 反引号
实现命令替换
$(COMMAND) = `COMMAND`
例如:
#echo "today is `date +%F`"
#echo "today is $(date +%F)"
变量的声明和赋值
声明:
#declare [OPTION] VARNAME 声明一个变量。
-i 声明为×××
-a 声明为数组
-r 声明为只读变量
-x 声明为环境变量
赋值:
#VAR1=VALUE
#VAR2=$VAR1
#VAR1=${VAR2-VALUE}
#VAR2=${VAR1}VALUE
例如:
#declare -i AGE
#AGE=23
#A=30
#declare -i AGE=23
#declare NAME="tony max"
#NAME= "$AGE"
#AGE=${A:-40} 若A有值,则AGE的值为A的值,若没有则赋值给40
变量的引用:
只有在引用的时候才带上$。
${VARNAME} 花括号可以省略。
例如:
#ANIMAL=pig
#echo "there are some $ANIMAL"
there are some pig
#echo "there are some ${ANIMAL}s"
there are some pigs
#echo "there are some $ANIMALs"
there are some
这里不加花括号,系统会认为变量名为ANIMALs。所以无法显示。
#echo 'there are sonme ${ANIMAL}s'
there are sonme ${ANIMAL}s
使用''是强引用,引号中的内容原封不动的输出。
变量的撤销:
#unset [OPTION] VARNAME
例如:
#unset NAME
#echo $NAME
变量赋值:
${PARAMETER:-word}
如果PARAMETER为空或未定义,则变量展开为"word",否则,则展开为PARAMETER的值。
例如:
#A=3
#echo ${A:-30} 若$A不为空,则A的结果为3。否则A的值为30
3
#unset A 撤销变量A
#echo ${A:-30} $A为空,则把30赋值给A。
30
#echo $A $A的值为空。不会改变变量本身的值。
#echo $A
#A=${A:-30} 若A为空,则把30赋值给A。若A不为空,则把A的值赋值给A。
#echo $A 因为没有设定变量A,所以A的值为30.
30
${PARAMETER:+word}
如果PARAMETER为空或未定义,不做任何操作,否则,则展开为"word"的值。
例如:
#unset A
#echo ${A:+30}
#A=3
#echo ${A:+30}
30
${PARAMETER:=word}
如果PARAMETER为空或未定义,则变量展开为"word",并将展开后的值赋值给PARAMETER。
例如:
#unset A
#echo ${A:=30}
30
#echo $A
30
${PARAMETER:offset:LENGTH}
取子串,从offset处的后一个字符开始,取LENGTH长的子串。LENGTH可省略,则取到最后。
例如:
#A='hello world'
#echo ${A:2:3}
llo
#echo ${A:2}
llo world
软件设备(bit bucket):
/dev/null 数据黑洞,是软件模拟的设备。
/dev/zero 泡泡机,生成大量的0。
/dev/random 随机数生成器,是基于中断的IRQS产生随机数的。IRQS跟一些特殊的硬件绑定,基于这些硬件的interrupts将会提供给random设备。
/dev/urandom 随机数生成器,不受interrupts的限制。
脚本:
命令的堆砌,按照实际需要结合命令流程控制机制实现的源程序。
任何脚本的第一行都得有shebang(魔数):
#!/bin/bash
#为注释
其余内容都被视为脚本的内容。
脚本的执行:
#./BASHNAME.sh
#bash BASHNAME.sh
或
将当前路径添加到PATH中。
脚本支持配置文件:
例如:
#vim a.sh
#!/bin/bash
. /root/a.conf 加载配置文件
TEST=${TEST:-EMPTY}
[-n "$TEST"] && echo $TEST
#vim a.conf
TEST='hello world'
#bash a.sh
hello world
#vim a.conf
#TEST='hello world'
#bash a.sh
EMPTY