xpz=xiaopzi
(1)echo ${xpz}
(2)echo $xpz
(3)注意:echo ${xpz}s 和 echo $xpzs 输出是不一样的
unset xpz
unset -f 函数名 //撤销函数
小结:bash是弱类型语言,默认会把变量当成字符串处理,所以,我们可以认为bash中的变量值都是字符串。
变量是存在作用域的概念的,按照作用域划分:本地变量和环境变量
本地变量的作用域:只对当前bash进程有效,对当前shell之外的其他shell进程,包括当前shell的子进程都无效
本地变量还分为:局部变量和全局变量
局部变量创建方式:local varname=value
局部变量的作用域:局部变量只对当前函数或者代码段有效
声明方式:export varname=value
作用域:当前shell进程以及子进程
1 source ./test.sh
. /root/test/test.sh
点 空格 脚本全路径
//表示脚本在当前进程执行
2 ./test.sh //打开一个子进程
声明方式:readonly varname=value
不可修改,不可撤销(unset),如果想让只读变量消失,只能退出当前shell
作用域:和本地变量一样,如果想让子shell进程继承,只能变成环境只读变量
声明方式:export readonly varname=value
$? 保存了上一个命令执行状态返回值
范围:0-255 0表示成功
位置变量
$# 表示传入脚本参数的个数
$@ 参数列表,获取到所有参数
$* 参数列表 同$#
${@:起点} 表示由起点开始(包括起点),取得后面的所有位置的参数
${@:起点:个数} 表示由起点开始(包括起点),取得后面的指定位置的参数
注意:当我们直接使用$和$@的时候,是没有区别的。但是,在对$和$@加引号后,变成"$","$@"后,这两种写法就有区别了
"$",传递给脚本所有参数,全部参数合为一个字符串
"$@",传递给脚本所有参数,每个参数为独立字符串
$0表示脚本自身,相当于basename输出的内容
$1,$2等 用来在脚本内引用传入脚本的参数值
declare
declare -i varname=value 整形
declare -x varname=value 环境变量
declare -r varname=value 只读变量
参数也可以混合使用
declare -rx varname=value 被继承的只读环境变量
(1) 使用let命令进行算术运算,只支持整形运算
(2) 使用expr命令进行算术运算,只支持整数运算
(3) 使用bc命令进行算数运算,支持小叔运算
(4) 使用运算符:$[算术表达式],只支持整数运算
(5) 使用运算语法:$((算术表达式)),只支持整数运算
(6)在初始化变量时,将变量定义定义为‘整数’类型,则可直接进行整数运算
1 小括号() ,在子进程中执行
(ls test;ls test2) | wc -l
2 大括号{},在当前进程中执行
{ls test; ls test2} | wc -l
注意:大括号里的所有命令都是用空格隔开,而且每个命令都必须以";"结尾,即使是最后一个命令也的这样
在shell中,"-gt"或者"-lt"只能用于比较两个数字的大小,当我们想要比较两个字符串的ASCLL值时,则必须使用">"或者"<",需要注意的是,当使用“双中括号”进行碰到时,">"或者"<"不用转椅即可正常使用,当使用”单中括号“进行碰到时,">"或者"<"需要转移后才能正常使用
name=xiaopzi
echo ${name} //打印变量
echo ${#name} //打印变量长度,多了个"#"
(1)从指定位置开始截取字符串
name=www.gsw6.com
echo ${name:4}?//gsw6.com
":4"表示从第四个开始,截取到末尾
echo ${name:0-4} //.com
"0-4"表示截取最后四个字符串
echo ${name: -4} //.com
" -4"和"0-4"相同的作用,只不过用空格代替了0
(2)从指定位置开始截取字符串,并且指定截取字符串长度
echo ${name:4:4} //ling
":4:4"表示从正数第四个字符串开始截取,向后截取4个字符的长度
echo ${name:0-9:4} //uncm
"0-9:4"表示从倒数第九个开始,向后截取4个
(3)掐头去尾截取之掐头截取
echo ${name#.}?//gsw6.com
"#."表示删除字符串从左到右第一个"."以及其左侧的全部字符。
echo ${name##.} //com
"##."表示删除从左到右最后一个遇到的".",以及其左侧的字符
(4)掐头去尾截取之去尾截取
echo ${name%.}?//www.gsw6.com
echo ${name%%.} //www
name=www.gsw6.com
echo ${name/w/a}?//aww.gsw6.com
"/w/a"表示替换字符串中的w为a,需要助于的是,他只替换第一个遇到的w,如果包含多个,其他的不会被替换
echo ${name//w/a}?//aaa.gsw6.com
"//w/a"表示把字符串中所有w换成a
name=www.linux.www
echo ${name/#www/aaa}?//aaa.linux.www
"#"只替换开头的
echo ${name/%www/aaa}?//www.linux.aaa
"%"只替换结尾的
name=www.gsw6.com
echo ${name/w}?//ww.gsw6.com
'/w'删除字符串中第一个遇到的w
echo ${name//w} //.gsw6.com
'//w'删除字符串中所有w
name=www.gsw6.www
echo ${name/#www} //.gsw6.www
只删除头部的www
echo ${name/%www}?//www.gsw6.com.
只删除尾部的www