shell变量详解
1 创建变量
xpz=xiaopzi
2 读取变量
(1)echo ${xpz}
(2)echo $xpz
(3)注意:echo ${xpz}s 和 echo $xpzs 输出是不一样的
3 撤销变量
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 被继承的只读环境变量
shell进行运算的各种方法
(1) 使用let命令进行算术运算,只支持整形运算
(2) 使用expr命令进行算术运算,只支持整数运算
(3) 使用bc命令进行算数运算,支持小叔运算
(4) 使用运算符:$[算术表达式],只支持整数运算
(5) 使用运算语法:$((算术表达式)),只支持整数运算
(6)在初始化变量时,将变量定义定义为‘整数’类型,则可直接进行整数运算
shell中的逻辑运算/布尔运算/短路与/短路或
shell中组合命令的方法
1 小括号() ,在子进程中执行
(ls test;ls test2) | wc -l
2 大括号{},在当前进程中执行
{ls test; ls test2} | wc -l
注意:大括号里的所有命令都是用空格隔开,而且每个命令都必须以";"结尾,即使是最后一个命令也的这样
shell中的‘-gt’与‘>’的区别
在shell中,"-gt"或者"-lt"只能用于比较两个数字的大小,当我们想要比较两个字符串的ASCLL值时,则必须使用">"或者"<",需要注意的是,当使用“双中括号”进行碰到时,">"或者"<"不用转椅即可正常使用,当使用”单中括号“进行碰到时,">"或者"<"需要转移后才能正常使用
bash中[]和[[]]的区别
shell中常用变量处理,字符串操作
1 获取变量的长度
name=xiaopzi
echo ${name} //打印变量
echo ${#name} //打印变量长度,多了个"#"
2截取变量
(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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!