shell编程基础、变量

检查脚本中的语法错误
bash -n script.sh

预览执行结果
bash -x script.sh

运行data目录下所有的脚本
run-parts /data 

bash和+x        开始子进程运行脚本    
source和 .    在当前进程运行脚本

bash展开命令行优先级:
1、把命令行分成单个单词    
2、展开别名
3、展开大括号的声明
4、展开波浪符声明
5、命令替换
6、再次把命令行分成命令词
7、展开文件统配
8、准备I/O重定向
9、运行命令

bash的配置文件,添加别名和变量
按生效范围划分:
全局配置:/etc/profile        
     /etc/profile/*.sh    
     /etc/bashrc        
个人配置:~/.bash_profile    存放用户环境变量或开机启动的命令    
     ~/.bashrc        存放别名或者函数    
     ~/.bash_logout        存放退出执行命令

交互式登录:su - user
非交互式登录:su user或脚本、图形界面        
/etc/profile/*.sh 和 ~/.bashrc 和 /etc/bashrc    交互式、非交互式登录都可使用
/etc/profile 和 ~/.bash_profile            只有交换式登录可用


set:显示所有变量
unset:删除变量
exit #:指定退出状态码
alias:显示别名,bash脚本不支持别名

变量命名法则:
1、不能使用程序中的保留字
2、只能使用数字、字母及下划线,且不能以数字开头
3、见名知义
4、统一命名规则:驼峰命名法

生效范围划分变量类型:
局部变量:当前shell进程

环境变量(全局变量):当前shell进程及其子进程,export或declare声明

位置变量:$1,$2,...来表示,用于表示运行脚本后面的参数,(set -- 清空所有位置变量)
$?:判断命令执行结果,0是表示成功,其他失败
$0:命令本身
$*:双引号下,全部参数合成一个字符串传递给脚本
$@:双引号下,每个参数为独立的字符串传递给脚本
$#:显示参数的个数
$$:显示当前进程号
$-:h-记录命令路径,i-交互式shell,m-监控模式,B-大括号扩展,H-历史命令

特殊变量:
():开启子shell执行,不影响当前shell环境   
{}:不开启子shell,影响当前shell环境 
shift n      把后面第n个参数变成到第一个参数   

bash内置的环境变量:
PATH    决定shell将到哪些目录中寻找命令或程序  
SHELL
USER
UID
HOME
PWD
SHLVL    bash嵌套深度
LANG
MAIL
HOSTNAME
HISTSIZE
_:前面命令的最后一个字符串
RANDOM:生成随机数(0-32767)


算术运算
let var=算术表达式
var=$[算术表达式]
var=$((算术表达式))

$?:判断命令执行结果,0是表示成功,其他失败
短路与  &&    正确就执行
短路或  ||    不正确就执行
非(取反)   !


0&&0=0
0&&1=0
1&&0=0
1&&1=1

cmd1 && cmd2
如果cmd1为假,cmd2不需要执行,反之cmd1为真,cmd2执行


0||0=0
0||1=0
1||0=0
1||1=1

cmd1 || cmd2
如果cmd1为真,cmd2不需要执行,反之cmd1为假,cmd2执行


短路或、短路与,后面命令一起执行加{;}
false || { echo cmd1 ; echo cmd2; }

cmd1 && cmd2 || cmd3
cmd2 true
cmd1 true 执行cmd2
cmd1 false 执行cmd3

异或 ^
0^1=1
0^0=0
1^1=0
1^0=1
两个值相同为假,不同为真


条件测试语句:(布尔值:0为真,1为假)
= > < 
!= 不等于
=~ 左侧表达式能否被右边扩展正则表达式匹配,与[[ ]]配合使用

格式:
test $s1 = $s2
[ $1 = $2 ]    用于简单的字符串或数字比较
[[ $1 == $2 ]]    使用正则表达式  

逻辑测试:
-a    并且,表达式相同为真
-o    或者,表达式一个真,就为真

数字测试:
-eq    等于则为真
-ne    不等于则为真
-gt    大于则为真
-ge    大于等于则为真
-lt    小于则为真
-le    小于等于则为真

字符串测试:
=    等于则为真
!=    不相等则为真
-z    字符串的长度为零则为真
-n    字符串的长度不为零则为真
=~    左侧表达式能否被右边扩展正则表达式匹配,与[[]]配合使用

文件测试:
-e    文件存在则为真
-r    文件存在且可读则为真
-w    文件存在且可写则为真
-x    文件存在且可执行则为真
-s    文件存在且至少有一个字符则为真
-d    文件存在且为目录则为真
-f     文件存在且为普通文件则为真
-c    文件存在且为块特殊文件则为真

文件特殊权限测试:
-u    文件存在且有suid权限
-g    文件存在且有sgid权限
-k    文件存在且有sticky权限


read  输入值分配给一个或多个shell变量
        -p    指定要显示的提示
    -s    静默输入,一般用于密码
    -n #    指定输入的字符长度#
    -d x    设置‘x’输入结束符
    -t #    TIMEOUT为#秒
read x y z <<<"i j k"    变量批量赋值


练习1:
硬盘使用率超过80%报警:
abc=`df |grep "sd" |tr -s " " "%" |cut -d "%" -f5 |sort -nr |head -1`
[ "$abc" -ge 80 ] && echo "disk will be full"


练习2:
鸡兔同笼(头35 脚94)
read -p "head number " h
read -p "feet number " f
chook=$[(h*4-f)/2]
rabbit=$[h-chook]
echo "chook number is $chook ; rabbit numer is $rabbit "

练习3:
判断yes or no
read -p "Do you agree?yes or no: " ans
&& echo "Please input yes or no"
[[ $ans =~ ^([Yy]|[Yy][Ee][Ss])$ ]] && echo "your answer is yes"
[[ $ans =~ ^([Nn]|[Nn][Oo])$ ]] && echo "your answer is no"

练习4:
修改PATH变量,新加变量建议放在前面
vim /etc/profile.d/*.sh
PATH=/usr/local/apache/bin:$PATH
. /etc/profile.d/*.sh

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金牌收租佬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值