首页 > 系统相关 >Shell编程规范与变量二

Shell编程规范与变量二

时间:2023-08-11 15:35:40浏览次数:49  
标签:Shell 变量 编程 echo nginx num 测试 bash 分支

目录

1. 条件测试

  • 条件测试:判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要由测试命令辅助完成

  • test 测试文件的表达式 是否成立

格式1:test 条件表达式
格式2:[条件表达式]
注意[]空格,否则会失败
测试是否成功使用 $?返回值
[ 操作符 文件或目录 ]
help test

1.1 文件测试

  • 条件测试

    格式
    [操作符 文件或目录]
    
  • 常用的测试操作符

    -d:测试是否为目录(Directory)
    -e:测试目录或文件是否存在(Exist)
    -f:测试是否为文件(File)
    -r:测试当前用户是否有权限读取(Read)
    -w:测试当前用户是否有权限写入(Write)
    -x:测试当前用户是否有权限执行(eXcute)
    

ll看到的并不实际有效,以实际操作结果为准

只要有一个执行权限,所有都有

1.2 数字测试

  • 整数值比较
格式
[整数1 操作符 整数2]
  • 常用的测试操作符
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)

1.3 字符串测试

格式

[ 字符串1 == 字符串2 ]  是否相同

[ 字符串1 != 字符串2 ]  是否不相同

[ -z  字符串 ]  是否为空

[ -n  字符串 ]  字符是否存在
  • 常用的测试操作符
==:字符串内容相同
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
-n: 字符是否存在

1.4 逻辑测试

格式
格式1:[ 表达式1 ]   操作符 [ 表达式2 ]... 
格式2:命令1  操作符  命令2 ... 
常见条件
-a 或 &&:逻辑与,“而且”的意思全真才为真
-o 或 ||:逻辑或,“或者”的意思一真即为真
!:逻辑否
且 与
第一个要真  第二个也为真才能是真
如果第一个为假,整个为假不用执行下个操作
[`id -u` -eqo ]&&
echo "该用户为超级管理员"
或
一真即为真
如果第一个为真  那么不用执行第二个
第二个为假  才需要执行第二个

1.5 双中括号

格式
[[ expression ]] 用法
== 左侧字符串是否和右侧的PATTERN相同
 注意:此表达式用于[[ ]]中,PATTERN为通配符
=~ 左侧字符串是否能够被右侧的正则表达式的PATTERN所匹配
 注意: 此表达式用于[[ ]]中;扩展的正则表达式

1.6 () {}

格式
(CMD1;CMD2;...)和 {空格CMD1;CMD2;...; } 都可以将多个命令组合在一起,批量执行

1.7 if语句

  • if是shell关键字
1.7.1 单分支

if:if 命令; then 命令; [ elif 命令; then 命令;] [ else 命令;] fi

单分支

if 判断条件;

then  条件为真的分支代码

fi
1.7.2 双分支
双分支

if 判断条件; then
 条件为真的分支代码

else
 条件为假的分支代码

fi
[root@localhost ~]#vim disk.sh
#!/bin/bash
use=`df -h | tr -s ' ' | cut -d ' ' -f5 | tail -n +2 | tr -d % | sort -rn | head -n 1`

                                            # 你要发送的信息  | 使用邮件 -s 标题   发送方
#[$use -gt 80 ] && echo "disk will be full,please check it" | mail -s checkinfo [email protected] || echo "磁盘正常"
 

if [ $use -gt 80 ]
then
   echo "disk will be full"
else
   echo "disk is normal"
fi
[root@localhost ~]#bash disk.sh
disk will be full

[root@localhost ~]#vim httpd.sh
#!/bin/bash
ss -natp | grep ':80' &>/dev/null
if [ $? -eq 0 ]
then
   echo "httpd服务已启动"
else
systemctl start httpd
if [ $? -eq 0 ]
then
   echo "启动成功"
else
   echo "启动失败"
fi
fi

[root@localhost ~]#bash httpd.sh
httpd服务已启动
1.7.3 多分支
多分支

if 判断条件1
then
 条件1为真的分支代码

elif 判断条件2
then
 条件2为真的分支代码

elif 判断条件3;then
 条件3为真的分支代码

...
else
 以上条件都为假的分支代码

fi  #结束标志
[root@localhost ~]#vim num.sh
#!/bin/bash
read -p "请输入你的分数(0-100):" num

if [ $num -ge 85 -a $num -le 100 ]
then
   echo "你棒呆了!"
elif [ $num -ge 60 -a $num -le 84 ]
then
   echo "你及格了!"
elif [ $num -ge 0 -a $num -le 59 ]
then
   echo "你不及格了"
else
   echo "输入有误,请输入0-100之间的正整数"
bash $0

fi
[root@localhost ~]#bash num.sh
请输入你的分数(0-100):90
你棒呆了!
[root@localhost ~]#bash num.sh
请输入你的分数(0-100):60
你及格了!
[root@localhost ~]#bash num.sh
请输入你的分数(0-100):30
你不及格了

1.8 case命令

格式
case $input in

PAT1)
 分支1
 ;;

PAT2)
 分支2
 ;;

...
*)
 默认分支
 ;;

esac #表示case语句块的结束

1.9 echo命令

echo -n   表示不换行输出
echo -e   表示输出转义符
常用的转义符

2. 使用shell脚本编译安装nginx

#!/bin/bash
read -p "先测试网络是否连接(点击回车自动测试)" ip
ping -c 3 112.112.112.112
if [ $? -eq 0 ]
then
        echo  "网络正常"

read -p "是否开始安装nginx(yes/no)" key
key=`echo $key | tr 'A-Z' 'a-z'`
case $key in
y|yes)

if [ -f "nginx-1.18.0_.tar.gz" ]
then
       echo "系统中有nginx源码包,请耐心等待安装......"

#关闭防火墙和selinux
systemctl stop firewalld.service
setenforce 0

#下载gcc编译环境
yum  install gcc pcre-devel openssl-devel zlib-devel openssl -y

#切换opt目录
cd /opt

#将nginx包解压到opt目录下
tar xf $(find / -name "nginx-1.18.0\_.tar.gz") -C /opt

#切换nginx
cd nginx-1.18.0/

#设置安装路径
./configure --prefix=/apps/nginx

#编译成二进制
make -j2

#安装
make install

#做软链接
ln -s  /apps/nginx/sbin/nginx  /usr/local/sbin

#添加nginx.service的配置文件
echo "
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target
">/usr/lib/systemd/system/nginx.service

#重新加载配置
systemctl daemon-reload

#启动nginx
systemctl start nginx

#查看nginx状态
systemctl status nginx

else

   echo "没有nginx安装包,请先装包"

fi

;;

n|no)

echo "取消安装"

;;

*)

echo "输入有误!"

esac

else
        echo  "网络无连接"
fi

标签:Shell,变量,编程,echo,nginx,num,测试,bash,分支
From: https://www.cnblogs.com/LJ69/p/17622600.html

相关文章

  • mapreduce编程模型介绍
    任何技术点在你未曾接触过的时候,都是觉得雾里看花,水中望月,既遥远又神秘,但是当你尝试学习并通过实践对其脉络掌握清楚以后,就会觉得原来这么简单,技术就是那么一回事儿。mapreduce分布式编程模型是google在2004年提出来的,目的是为了解决海量数据的处理,我们通过一段时间的应用,对mapredu......
  • 异步线程变量传递必知必会---InheritableThreadLocal及底层原理分析
    InheritableThreadLocal简介笑傲菌:多线程热知识(一):ThreadLocal简介及底层原理3赞同·0评论文章上一篇文章我们聊到了ThreadLocal的作用机理,但是在文章的末尾,我提到了一个问题,ThreadLocal无法实现异步线程变量的传递。什么意思呢?以下面的代码为例子:@SneakyThrowspublicBo......
  • 8.10 睡觉集合与钉耙编程
    有时候我们不需要太复杂的结论与算法,只要时间复杂度够就行了。交朋友给定\(n\)个点和\(m\)条有向边。每次可以执行操作:找到\((p,u)\inE\)与\((p,v)\inE\),连\((u,v)\)和\((v,u)\)。问图中最大能有多少条边后来连的有三种边:两条\(m\)里的边连起来的。一条\(m......
  • 【C语言基础语法】2. 变量和数据类型
    目录一、变量和常量 1.1关键字 1.2数据类型 1.3变量名命名二、进制三、整型 3.1整型的输出 3.2整型的输入 3.3整型的分类四、字符 4.1字符的输出 4.2字符的输入 4.3ascill码表 4.4转义字符五、浮点型六、类型限定符七、格式化 7.1格式化输出 7.......
  • TaskDecorator——异步多线程中传递上下文等变量
    目录TaskDecorator定义TaskDecorator实例线程池使用TaskDecorator开发中很多数据如oauth2的认证信息,日志TracerId都是在请求线程中的,如果内部使用多线程处理就存在获取不到认证信息或TraceId的问题。这时候就需要处理子线程与主线程间数据传递的问题。TaskDecorator这个......
  • 《C++ GUI Qt4编程》第2章——创建对话框——深入介绍信号和槽
    槽和普通的C++成员函数几乎是一样的——可以是虚函数;可以被重载;可以是公有的、保护的或者私有的,并且也可以被其他C++成员函数直接调用,它们的参数可以是任意类型。唯一不同的是:槽还可以和信号连接在一起,在这种情况下,每当发射这个信号的时候,就会自动调用这个槽。connect(sender,SI......
  • MATLAB R2023a Mac(专业编程和数学计算软件)
    MATLABr2023是一款功能强大的编程和数学计算工具,取用于处理科学、工程和数学应用程序中的复杂数据,可用于科学研究、信号处理、计算机视觉,机器学习,人工智能以及相关软件领域。适用范围:MATLAB是一款功能强大的编程工具,可以帮助您完成科学、工程或数学应用程序的开发工作。在您进......
  • 《CUDA编程:基础与实践》读书笔记(4):CUDA流
    1.CUDA流一个CUDA流指的是由主机发出的在一个设备中执行的CUDA操作序列。除主机端发出的流之外,还有设备端发出的流,但本文不考虑后者。一个CUDA流中的各个操作按照主机发布的次序执行;但来自两个不同CUDA流的操作不一定按照某个次序执行,有可能是并发或者交错地执行。任何CUDA操作......
  • CUDA 编程基础
    基于c/c++的编程方法支持异构编程的扩展方法简单明了的apis,能够轻松的管理存储系统cuda支持的编程语言:c/c++/python/fortran/java…1、CUDA并行计算基础异构计算CUDA安装CUDA程序的编写CUDA程序编译利用NVProf查看程序执行情况gpu不是单独的在计算机中完成任......
  • Java 编程中关于异常处理的 10 个最佳实践
    异常处理在编写健壮的Java应用的过程中,扮演着一个重要的角色。它并不是应用的功能需求,且需要优雅的处理任何错误情况,例如资源不可用,错误的输入,null输入等等。Java提供几个异常处理功能,并通过try,catch和  finally关键字内嵌在语言的本身。Java编程语言同样允许创建新的异常和使......