shell编程入门 第一章 基本语法

news2025/3/12 19:58:47

shell编程的语法主要分为五个环节,分别是变量,字符串,运算符,流程控制,函数五大部分


shell编程的基础语法

  • 一 变量
    • 1.1 shell变量名
    • 1.2 使用shell变量
    • 1.3只读变量
    • 1.4 删除变量
  • 二 字符串
    • 2.1 定义时最好用双引号
    • 2.2获取字符串长度
    • 2.3提取子字符串
    • 2.4 查找子字符串
  • 三 运算符
    • 3.1算数运算符
    • 3.2 关系运算符
      • 3.2.1 数字之间的关系
      • 3.2.2 文件权限
  • 四 流程控制
    • 4.1 if判定
    • 4.2 case语句
    • 4.3 for循环
    • 4.4 while循环
  • 五 函数
    • 5.1 函数基础
    • 5.2 自动化监视脚本

一 变量

1.1 shell变量名

1. 变量名中不能用$(这个符号在shell中表示引用)
2. 变量名和等号之间不能有空格

username="张三"

3. 可以使用字母数字下划线,但是首字母不能以下划线开头
4. 不能使用bash里的关键字
5. 不能使用标点符号,中间不能有空格

1.2 使用shell变量

使用一个定义过的shell变量,在变量名的前面加上$

yourname=zhangsan
myname=lisi
echo $yourname
echo ${yourname}
# 加花括号可以识别变量边界

1.3只读变量

只读变量和Java里的常量很像,定义了之后,这个变量不能随便被赋值,或者被unset删除

readonly yourname

1.4 删除变量

只读变量不能山,普通变量可以删

unset myname

二 字符串

2.1 定义时最好用双引号

  1. 单引号转义时存在无法识别的问题,单引号中任何字符都会原样输出
#!/bin/bash
skill='java'
str='I am good at $skill'
echo $str

运行结果:

I am good at $skill
  1. 双引号里可以有变量,可以有转义字符
 #!/bin/bash
skill='java'
str="I am good at $skill"
echo $str

运行
[root@localhost test]# sed -i ‘s/\r$//’ test1.sh
[root@localhost test]# ./test1.sh
I am good at java

2.2获取字符串长度

shell代码

#!/bin/bash
skill='java'
echo ${skill}
echo ${#skill}

输出结果
[root@localhost test]# sed -i ‘s/\r$//’ test1.sh
[root@localhost test]# ./test1.sh
java
4

2.3提取子字符串

shell代码

#!/bin/bash
skill='I like Java'
echo ${skill:2}   
#substring(2)
#从第二个字符开始截取
echo ${skill:2:2}
#substring(2,2)
#从索引2处开始截取两个字符

输出结果
[root@localhost test]# sed -i ‘s/\r$//’ test1.sh
[root@localhost test]# ./test1.sh
kike Java
ki

2.4 查找子字符串

查找like字符串中字符i所在的位置
shell代码

#!/bin/bash
skill='like'
echo `expr index "$skill" i`

[root@localhost test]# sed -i ‘s/\r$//’ test1.sh
[root@localhost test]# ./test1.sh
2

三 运算符

虽然原生bash不支持数学运算,但是可以通过expr来实现
使用有两个个原则

  • 表达式和运算符之间要有空格
  • 完整的表达式要被飘号包含,飘号的位置在esc键的下边

3.1算数运算符

可以看一下图中的示范脚本,加减乘除取余赋值,==,!=

#!/bin/bash
skill='like'
a=8
b=9
# 加法 +
echo ` expr $a + $b `
# 减法 -
echo ` expr $a - $b `
# 乘法 *
echo ` expr $a \* $b `
# 除法 /
echo ` expr $b / $b `
# 取余 %
echo ` expr $b % $a `


# 赋值 =
echo skill
echo  ` expr a=$b ` 
# 相等 == 返回值为true
#echo ` [ $a == $b ] `
# 不等 != 返回值为false 
#echo ` [ $a!= $b ] `

3.2 关系运算符

这个主要分为三个类型,一是数字之间的关系,二是文件权限的关系,三是文件类型之间的关系

3.2.1 数字之间的关系

-eq      (equal)        等于
-ne      (not equal)     不等于 
-lt      (less than)     少于
-le      (less equal)    少于等于
-gt     (greater than)  大于
-ge      (grater equal)  大于等于

3.2.2 文件权限

linux是一个多用户的系统,多用户要采用权限分段方式来执行指令,它用三组二进制数来表示一个文件的权限,如下图所示

  • 简写是从000到777 ,三个位置分别代表rwx,读写执行
  • 000 000 000 基本上什么操作都做不了
  • 111 111 111 所有权限都可以 最高777,意思是所有者,组,公共,都可以
    在这里插入图片描述

四 流程控制

4.1 if判定

#!/bin/bash

if [ "$1"x = "gu"x ]
then
	echo "welcome, gu"
fi

# 输入第二个参数,表示年龄,判断属于哪个年龄段
if [ $2 -lt 18 ]
then
	echo "未成年人"
elif [ $2 -lt 35 ]
then
	echo "青年人"
elif [ $2 -lt 60 ]
then
	echo "中年人"
else
	echo "老年人"
fi

4.2 case语句

#!/bin/bash

case $1 in
1)
	echo "one"
;;
2)
	echo "two"
;;
3)
	echo "three"
;;
*)
	echo "number else"
;;
esac

4.3 for循环

#!/bin/bash
for IP in `cat /root/for/ip.txt`    #ip文件为存放ip地址的
do
  ping -c 3 -i 0.2 -w 3 $IP &>/dev/null #-c 3 ping3次主机 -i 0.2ping主机间隔 -w 3ping主机超时间隔
  if [ $? -eq 0 ];then
  echo "host $IP is up"
  else echo "host $IP is down"
  fi
done

4.4 while循环

#!/bin/sh
counter=5
factorial=1
while [ $counter -gt 0 ]
do 
      factorial=$(( $factorial * $counter ))
      ((counter--))
done 
echo $factorial

五 函数

5.1 函数基础

sh文件

#!/bin/bash
# 定义函数
fun1 (){
   echo "这是一个函数"
}
#调用函数
fun1

运行过程
[root@localhost test]# sed -i ‘s/\r$//’ test2.sh
[root@localhost test]# ./test2.sh
这是一个函数

5.2 自动化监视脚本

流量检测

#!/bin/bash
NIC=$1
echo -e " In ------ Out"
while true; do
    OLD_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev)
    OLD_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
    sleep 1
    NEW_IN=$(awk  '$0~"'$NIC'"{print $2}' /proc/net/dev)
    NEW_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
    IN=$(printf "%.1f%s" "$((($NEW_IN-$OLD_IN)/1024))" "KB/s")
    OUT=$(printf "%.1f%s" "$((($NEW_OUT-$OLD_OUT)/1024))" "KB/s")
    echo "$IN $OUT"
    sleep 1
done

服务器初始化

#/bin/bash
# 设置时区并同步时间
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
if ! crontab -l |grep ntpdate &>/dev/null ; then
    (echo "* 1 * * * ntpdate time.windows.com >/dev/null 2>&1";crontab -l) |crontab
fi
 
# 禁用selinux
sed -i '/SELINUX/{s/permissive/disabled/}' /etc/selinux/config
 
# 关闭防火墙
if egrep "7.[0-9]" /etc/redhat-release &>/dev/null; then
    systemctl stop firewalld
    systemctl disable firewalld
elif egrep "6.[0-9]" /etc/redhat-release &>/dev/null; then
    service iptables stop
    chkconfig iptables off
fi
 
# 历史命令显示操作时间
if ! grep HISTTIMEFORMAT /etc/bashrc; then
    echo 'export HISTTIMEFORMAT="%F %T `whoami` "' >> /etc/bashrc
fi
 
# SSH超时时间
if ! grep "TMOUT=600" /etc/profile &>/dev/null; then
    echo "export TMOUT=600" >> /etc/profile
fi
 
# 禁止root远程登录
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
 
# 禁止定时任务向发送邮件
sed -i 's/^MAILTO=root/MAILTO=""/' /etc/crontab
 
# 设置最大打开文件数
if ! grep "* soft nofile 65535" /etc/security/limits.conf &>/dev/null; then
    cat >> /etc/security/limits.conf << EOF
    * soft nofile 65535
    * hard nofile 65535
EOF
fi
 
# 系统内核优化
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 20480
net.ipv4.tcp_max_syn_backlog = 20480
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_fin_timeout = 20
EOF
 
# 减少SWAP使用
echo "0" > /proc/sys/vm/swappiness
 
# 安装系统性能分析工具及其他
yum install gcc make autoconf vim sysstat net-tools iostat if

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/433249.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EMC 电路设计基础

EMC 在 JIS 中被定义为“电磁兼容性”&#xff0c;意为“不对其他设备产生电磁干扰&#xff0c;即使受到来自其他设备的电磁干扰&#xff0c;仍能保持原有的性能”&#xff0c;也就是具备相互兼顾兼容的性质。 EMC 大致分为 EMI&#xff08;电磁干扰&#xff09;和 EMS&#x…

Chinese-LangChain:基于ChatGLM-6b+langchain实现本地化知识库检索与智能答案生成

Chinese-LangChain Chinese-LangChain&#xff1a;中文langchain项目&#xff0c;基于ChatGLM-6blangchain实现本地化知识库检索与智能答案生成 https://github.com/yanqiangmiffy/Chinese-LangChain 俗称&#xff1a;小必应&#xff0c;Q.Talk&#xff0c;强聊&#xff0c;Qi…

python中的logging模块:从入门到高阶

简单使用 在 Python 中&#xff0c;可以使用内置的 logging 模块来记录应用程序的信息。最简单的用法是使用 basicConfig() 函数配置 logging 模块&#xff0c;然后使用 getLogger() 方法创建一个 Logger 对象&#xff0c;用于记录信息。下面是一个简单的例子&#xff1a; im…

基于html+css的图片展示16

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

No.043<软考>《(高项)备考大全》【第26章】软件工程国家标准

【第26章】软件工程国家标准 1 章节相关1.1 考试相关 2 标准2.1 标准级别及目录 3 软件工程术语4 软件生存周期过程、活动和任务4.1 必背4.2 ★软件生命周期各阶段与软件文档编制工作的关系--熟悉.4.3 各类人员与软件文档的使用关系--熟悉 5 文档控制5.1 SRS需求规格说明书 6 软…

一年一度的PMO大会将于2023年6月在京召开

企业要基业长青就必须持续保持组织活力。企业的内外部环境不会一成不变&#xff0c;顺应变化及时调整变革避免组织出现僵化低效才能在激烈的市场竞争中存活下来。PMO从成立到逐渐发挥越来越强的作用本身即是一种组织变革的过程&#xff0c;从这个意义上来说PMO因组织变革而生&a…

Nginx Rewrite

常用的Nginx正则表达式 ^&#xff1a;匹配输入字符串的起始位置 $ : 匹配输入字符串的结束位置 * : 匹配前面的字符零次或多次 &#xff1a;匹配前面的字符一次或多次 ?: 匹配前面的字符零次或一次 . : 匹配除“\n”之外的任何单个字符 ^$ : 空行 \&#xff1a;将后面…

百度发布Apollo城市智驾,距离AI智能驾驶还有多远?

推荐&#xff1a;将NSDT场景编辑器加入你的3D工具链。 工具集&#xff1a;NSDT简石数字孪生 随着人工智能技术的不断发展&#xff0c;智能驾驶已经成为了汽车行业的一个重要领域。智能驾驶可以减少人为驾驶的错误和疲劳驾驶等不安全因素&#xff0c;提高驾驶安全性&#xff0c…

内蒙农信携手星环科技建设农信大数据平台,激活金融业务创新

背景 内蒙古自治区农村信用社联合社&#xff08;简称“内蒙农信”&#xff09;经过多年的信息化建设&#xff0c;目前投产使用的信息化系统近100套&#xff0c;产生了大量的数据。该社于2019年采用MPP架构的分布式数据库&#xff0c;实现了40多套业务系统数据的归集、标准化处理…

1007、1009:与进制问题、输出问题

1007 题目&#xff1a;本题要求计算A/B&#xff0c;其中A是不超过1000位的正整数&#xff0c;B是1位正整数。你需要输出商数Q和余数R&#xff0c;使得A B * Q R成立 思路&#xff1a;对于数字元素拆分&#xff0c;除法的计算方法用代码实现&#xff08;唯一一点就是在输出的…

如何一招搞定PCB阻焊过孔问题?

PCB阻焊油墨根据固化方式&#xff0c;阻焊油墨有感光显影型的油墨&#xff0c;有热固化的热固油墨&#xff0c;还有UV光固化的UV油墨。而根据板材分类&#xff0c;又有PCB硬板阻焊油墨&#xff0c;FPC软板阻焊油墨&#xff0c;还有铝基板阻焊油墨&#xff0c;铝基板油墨也可以用…

Elasticsearch:使用 Elastic APM 监控 Android 应用程序(二)

在我之前的文章 “Elasticsearch&#xff1a;使用 Elastic APM 监控 Android 应用程序&#xff08;一&#xff09;” 中&#xff0c;我详述了如何使用 Elastic APM 来监控 Android 应用程序。在今天的文章中&#xff0c;我来详述如何部署 Elastic Stack&#xff0c;并使用文章中…

《港联证券》新三板股票交易规则是什么?如何进行交易?

新三板分为根底层、创新层和精选层。新三板股票设置了一些规则&#xff0c;既约束了一些新三板挂牌公司的股权进入生意市场&#xff0c;一起也约束了一些投资者进行投资&#xff0c;保证了新三板市场的安全。那么新三板股票生意规则是什么&#xff1f;怎么进行生意&#xff1f;…

【PMP】项目各阶段分别运用什么工具与技术汇总

做项目管理是一条漫漫长路&#xff0c;所有的本事&#xff0c;都是靠一个个项目&#xff0c;一点点积累而来的&#xff0c;并不存在“迅速上手”的方法论。一名普通项目经理的成长&#xff0c;都要经过一定时间的修炼。 数据收集 头脑风暴 在短时间内获得大量创意&#xff0…

「ML 实践篇」模型训练

在训练不同机器学习算法模型时&#xff0c;遇到的各类训练算法大多对用户都是一个黑匣子&#xff0c;而理解它们实际怎么工作&#xff0c;对用户是很有帮助的&#xff1b; 快速定位到合适的模型与正确的训练算法&#xff0c;找到一套适当的超参数等&#xff1b;更高效的执行错…

SSM--mybatis逆向工程生成

SSM学习笔记–mybatis逆向工程生成 文章目录SSM学习笔记--mybatis逆向工程生成1. 创建数据库和表2. Mybatis Generator 逆向工程1. 创建数据库和表 -- 创建 furns_ssm DROP DATABASE IF EXISTS furn_ssm; CREATE DATABASE furn_ssm; USE furn_ssm;-- 创建家居表 CREATE TABLE …

Node.js—fs模块

目录 1、什么是fs2、同步和异步调用3、文件写入3.1 writeFile 异步写入3.2 writeFileSync 同步写入3.3 appendFile / appendFileSync 追加写入3.4 createWriteStream 流式写入3.5 写入文件的场景 4、文件读取4.1 readFile 异步读取4.2 readFileSync 同步读取4.3 createReadStre…

C++基础知识总结(详解)

前言 文章篇幅较大&#xff0c;内容充实 请在阅读的过程中保持一个批判的态度 C基础 C头文件 C有自己的头文件&#xff0c;例如iostream 没有.h 也可以用C的头文件 例如stdio.h 有.h 或者将C文件C化 例如cstdio 前面加c没有.h 名字空间 划分逻辑单元。避免名字冲突 创建…

JWT 实现登录认证 + Token 自动续期方案

前言 过去这段时间主要负责了项目中的用户管理模块&#xff0c;用户管理模块会涉及到加密及认证流程。今天就来讲讲认证功能的技术选型及实现。技术上没啥难度当然也没啥挑战&#xff0c;但是对一个原先没写过认证功能的菜鸡来说也是一种锻炼吧。 技术选型 要实现认证功能&a…

【短篇】函数重载

函数重载 重载使用规则 重载 函数重载也是CPP相较于C的一个优化内容。 在C中我们都知道函数名不能重名 当然这个错误对于我还有类似我这种只学过C的人来说&#xff0c;这个错误是显得多么理所当然。 但是在Cpp中&#xff0c;则对这个功能进行了优化 看到这就有人问了&#x…