linux shell脚本编程基础

变量种类
局部变量:只对当前shell有效,可使用set查看
赋值:name= 'value'
可以使用引用value:
(1)可以是直接字串:name = "root"
( 2 ) 变量引用:name="$USER"
( 3 ) 命令引用:name='COMMAND' name =$(COMMAND)
变量引用:${name} $name
" " : 若引用,其中的变量引用会被替换为变量的值
' ' :强引用,其中的变量引用不会被替换为变量的值 ,而会保持原字符串
显示已定义的所有变量 : set
删除变量:unset name
环境变量:对当前shell及其子shell有效,可使用set、env查看
declare -x 显示所有环境变量
设置方式 export 本地变量名
export 变量名=值
若修改环境变量的值,可直接变量名=值而不再需要加export
单引号引起的内容不会执行
位置化变量:$1 $2 ...来表示,用于让脚本在脚本代码中调用命令行传递给它的参数

只读变量 :只能声明,不能修改和删除

随着当前shell退出而消失
声明只读变量:
readoniy name
declare -r name
把已存在变量改为只读变量:
declare -x name
查看只读变量:
readonly -p
basename 取出文件名基名
位置变量:在脚本代码中调用通过命令行传递给脚本的参数
$1,$2,...:对应第1、第2等参数,shift [n]换位置(往前移)
$0: 命令本身
$*: 传递给脚本的所有参数,全部参数合为一个字符串
$@:传递给脚本的所有参数,每个参数为独立字符串
$#: 传递给脚本的参数的个数
$@$* 只在被双引号包起来的时候才会有差异
set -- 清空所有位置变量
特殊变量
?:显示上一条命令的执行成功与否:0为成功 1为失败
0 :位置化变量中的命令本身
* :位置化变量中的所有参数
@:位置化变量中的所有参数
# :位置化变量的个数
$ :显示当前Shell的进程号
退出状态
进程使用退出状态来报告成功或失败
0 代表成功 1-255代表失败
$?变量保存最近的命令退出状态

bash自定义退出状态码
exit [n]:自定义退出状态码
注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状 态码
算术运算
echo $[$RANDOM%50+1] 随机抽取50以内数字
+ - * / %取摸(取余) **乘方
实现算术运算
(1)let var =算数表达式
(2)var=$[算数表达式]
(3)var=$((算数表达式))
(4)var=$(expr arg1 arg2 arg3...)
(5)declare - i var = 数值
(6)echo ‘算数表达式’ | bc
自增、自减:
let var+=1 加1
let var++ 加1
let var-=1 减1
let var-- 减1
逻辑运算
或 两个0为0 其余为1
1与1 =1 1与0=0 0与1=0 0与0=0
与 两个1为1 其余为0
1或1 =1 1或0=1 0或1=1 0或0=0
非 非0为1 非1为0
1=0 0=1
短路与
第一个为0,结果必定为0 第一个为1,第二个必须要参与运算
短路或
第一个为1,结果必定为1 第一个为0,第二个必须要参与运算
&& 前面命令执行成功才会执行后面命令
| | 前面命令执行失败才会执行后面命令
例子 :UserName=liuchan; id $UserName &> /dev/null && echo "$UserName is already exist" || ( useradd $UserName ;echo "$UserName created" & )
liuchan用户存在则执行前面命令 不存在执行后面命令
test命令 (测试)
[ a == a ]简写
test a == a
数字比较:
== 表示字符串是否相等
-eq 表示两个整数是否相等(可以为负,不能为小数。可为算数表达式)
-gt 表示左边的数是否大于右边的数
-ge 左边的数是否大于等于右边的数
-lt 左边的数是否小于右边的数
-le 左边的数是否小于等于右边的数
-ne 左边的数是否不等于右边的数
字符串比较:
== 是否相同
!= 或 <> 是否不同
~= 左侧的字符串能否被右侧的PATTERN所匹配(左边是否包含右边)
[[ ab =~ a ]]
>
[[ b > a ]] 表示在默认编码表中的顺序,排后面的是较大的。
<
[[ a < b ]]
-z "String" 判断字符串是否为空,为空时为真
-n "String" 判断字符串是否为非空,为非空时为真
文件判断:
-a 或 -e filename 判断文件是否存在,若存在则为真
-b 判断文件是否为块设备
-c 判断文件是否为符号设备
-d FILE:是否存在且为目录文件
-f FILE: 是否存在且为普通文件
-h FILE或 -L FILE:是否存在且为符号链接文件
-p FILE:是否存在且为命名管道文件
-S FILE: 是否存在且为套接字文件

文件权限测试:
-r FILE:是否存在且可读
-w FILE: 是否存在且可写
-x FILE:是否存在且可执行
文件特殊权限测试:
-u FILE: 是否存在且拥有suid权限
-g FILE: 是否存在且拥有sgid权限
-k FILE: 是否存在且拥有sticky权限
文件大小测试:
-s FILE: 是否存在且非空
文件是否打开:
-t fd: fd 文件描述符是否在某终端已经打开
-N FILE:文件自从上一次被读取之后是否被修改过
-O FILE:当前有效用户是否为文件属主
-G FILE:当前有效用户是否为文件属组

双目测试:
FILE1 -ef FILE2: FILE1是否是FILE2的硬链接
FILE1 -nt FILE2: FILE1是否新于FILE2(mtime)
FILE1 -ot FILE2: FILE1是否旧于FILE2

转译
\ 完全单个转译
'' 完全范围转译
"" 不完全范围转译对于以下四个符号不可转译
不能去! \ $ `
A="my hostname is $(hostname)"
[root@instructor_v7(nanyibo) app]# echo $A
my hostname is instructor.magedu.com

shell 两种登录方式
登录式shell
登录图形化
登录文本tty终端
远程登录ssh,telnet
su -
读取顺序:/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashr
非登录式shell
su
执行shell脚本
在已登陆的图形界面打开终端
读取顺序:~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

source 和 . 在当前shell下执行来自文件的命令。
使用脚本执行 是在子shell下执行命令,那么父shell是无法继承来自脚本中的变量


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值