首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >linux学习-bash shell 编程

linux学习-bash shell 编程

作者头像
solate
发布于 2019-07-22 08:56:27
发布于 2019-07-22 08:56:27
4.2K02
代码可运行
举报
文章被收录于专栏:solate 杂货铺solate 杂货铺
运行总次数:2
代码可运行

shell 学习

hello world

编辑shell文件 vim hello.sh

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash
# This is a hello world
echo "hello world"

保存退出,加运行权限chmod u+x hello.sh(当前用户运行权限 ,a+x 所有人运行权限), 运行./hello.sh

例子说明:
  • #! 说明文件类型,类似windows文件后缀(.exe), linux 根据 #! 以及后面字符串信息确定文件类型(man magic 命令 以及 /usr/share/magic 了解更多)
  • /bin/bash 表明文件是一个bash程序,需要/bin下bash程序解释执行,使用locate bashfind / -name bash 2>/dev/nullwhereis bash 三个命令找出bash所在位置,如果没有需要自己安装bash安装包
  • bash中绝大多数语句没有分号
如何执行
  • bash hello.sh 或 sh hello.sh 显式执行
  • chmod u+x hello.sh,运行./hello.sh

bash被执行实际是linux另外开了一个进程来运行的。

变量

script 设置的变量名称: $0 /path/scriptname 命令名称,$1...$n 参数

  • $# :代表后接的参数『个数』,以上面为例这里显示为『 4 』;
  • $@ :代表『 "$1" "$2" "$3" "$4" 』之意,每个变量是独立的(用双引号括起来);
  • $* :代表『 "$1c$2c$3c$4" 』,其中 c 为分隔字符,默认为空格键.

Shell编程中,使用变量无需事先声明,同时变量名的命名须遵循如下规则

  1. 首个字符必须为字母(a-z,A-Z) 或者_
  2. 中间不能有空格,可以使用下划线(_)
  3. 不能使用其他标点符号

需要给变量赋值时,写成变量名=值。 注意:不能在"="两边留空格

取用一个变量的值,只需在变量名前面加一个$

可以和其他文字混起来书写

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
num=2
echo "this is the ${num}nd"

shell的默认赋值是字符串赋值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var=1
var=$var+1
echo $var

# 打印出来的不是2而是11,要达到目的用下面的替换
let "var+=1"
var="$[$var+1]"
((var++))
var=$(($var+1))
var="$(expr "$var" + 1)" #不建议使用
var="`expr "$var" + 1`" #强烈不建议使用,注意加号两边的空格,否则还是按照字符串的方式赋值,`为Esc下方的`,而不是单引号'

let表示数学运算,expr用于整数值运算,每一项用空格隔开,$[]将中括号内的表达式作为数学运算先计算结果再输出。

使用date 进行文档建立(test.2016-12-13.dat)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "I will use 'touch' command to create 3 files." # 纯粹显示信息
read -p "Please input your filename: " fileuser         # 提示使用者输入

# 2. 为了避免使用者随意按 Enter ,利用变量功能分析文件名是否有设定? 
filename=${fileuser:-"filename"}           # 开始判断有否配置文件名

# 3. 开始利用 date 指令来取得所需要的文件名了;
date1=$(date --date='2 days ago' +%Y%m%d)  # 前两天的日期
date2=$(date --date='1 days ago' +%Y%m%d)  # 前一天的日期
date3=$(date +%Y%m%d)                      # 今天的日期
file1=$filename${date1}                  # 底下三行在配置文件名
file2=$filename${date2}
file3=$filename${date3}

# 4. 将档名建立吧!
touch "$file1"                             # 底下三行在建立档案
touch "$file2"
touch "$file3"

关于filename=${fileuser:-"filename"}的用法,用来判断fileuser是否已经赋值。:-是一起的;fileuser 如果有值的话,就用所拥有的值赋予给filename变量;无值的话,就把filenname赋予给fileuser,再赋予给filename变量

shell 流控制

if 语句
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if ....; then
  ....
elif ....; then
  ....
else
  ....
fi

通常用" [ ] "来表示条件测试,要确保方括号前后的空格,[$条件$]左右必须各敲一个括号($表示空格)

  • [ -f "somefile" ] :判断是否是一个文件
  • [-d “Directory”] : 判断目录是否存在
  • [ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
  • [ -n "$var" ] :判断$var变量是否有值
  • [ "$a" = "$b" ] :判断$a和$b是否相等
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash

if [ ${SHELL} = "/bin/bash" ]; then
   echo "your login shell is the bash (bourne again shell)"
else
   echo "your login shell is not bash but ${SHELL}"
fi
&& 和 || 操作符
  1. command1 && command2: &&左边的命令返回真(即返回0,成功被执行)后,&&右边的命令才能够被执行
  2. command1 || command2 : ||则与&&相反。如果||左边的命令未执行成功,那么就执行||右边的命令;
case 语句
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
case ... in
   ...) do something here
   ;;
esac
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 #!/bin/bash

 ftype="$(file "$1")"
 case "$ftype" in
 "$1: Zip archive"*)
    unzip "$1" ;;           #每个类别结尾使用两个连续的分号来处理
 "$1: gzip compressed"*)
    gunzip "$1" ;;
 "$1: bzip2 compressed"*)
    bunzip2 "$1" ;;
 *) echo "File $1 can not be uncompressed with smartzip";;  #最后一个变量内容都会用 * 来代表所有其他值
 esac                      #最终的 case 结尾
select 语句

select表达式是bash的一种扩展应用,擅长于交互式场合。用户可以从一组不同的值中进行选择

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select var in ... ; do
 break;
done
.... now $var can be used ....
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash

echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
  break;
done
echo "You have selected $var"
while/for 循环

只要测试表达式条件为真,则while循环将一直运行。关键字"break"用来跳出循环,而关键字”continue”则可以跳过一个循环的余下部分,直接跳到下一次循环中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
while [ condition ]  <==中括号内的状态就是判断表达式
do            <==do 是循环的开始!
  程序段落
done          <==done 是循环的结束

for循环会查看一个字符串列表(字符串用空格分隔),并将其赋给一个变量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for var in ....; do
   ....
done
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash

for var in A B C ; do
   echo "var is $var"
done

for var in "$@"; do // $@ 包含有输入的所有命令行参数值 for var in "$*"; do // $* 意思是差不多的。但是只有一个字串。如果不加引号,带空格的参数会被截断

Shell里的一些特殊符号

1.* :通配符,可以使用双引号和单引号防止扩展.

单引号更严格一些,它可以防止任何变量扩展;而双引号可以防止通配符扩展但允许变量扩展:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash

echo $SHELL
echo "$SHELL"
echo '$SHELL'

#结果
/bin/bash
/bin/bash
$SHELL

2.\ 转义字符

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo \*.jpg
echo \$SHELL

#结果
*.jpg
$SHELL
函数 function
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function fname() {
  程序段
}

函数没有必要声明。必须在执行之前出现定义就行

function 也是拥有内建变量,内建变量与shell很类似,函数名称代表示 $0 ,而后续接变量也是以 $1, $2... 来取代的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH

function printit(){
  echo "Your choice is $1"   # 这个 $1 必须要参考底下指令的下达
}

echo "This program will print your selection !"
case $1 in
  "one")
  printit 1  # 请注意, printit 指令后面还有接参数!
  ;;
  "two")
  printit 2
  ;;
  "three")
  printit 3
  ;;
  *)
  echo "Usage $0 {one|two|three}"
  ;;
esac


#结果
输入  sh test.sh one
结果  Your choice is 1
因为打印方法传递的参数是1.

调试

sh [-nvx] scripts.sh

  • -n :不要执行 script,仅查询语法的问题;
  • -v :再执行 sccript 前,先将 scripts 的内容输出到屏幕上;
  • -x :将使用到的 script 内容显示到屏幕上,这是很有用的参数!
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
监控 Kubernetes 集群证书过期时间的三种方案
Kubernetes 中大量用到了证书, 比如 ca证书、以及 kubelet、apiserver、proxy、etcd等组件,还有 kubeconfig 文件。
东风微鸣
2022/12/01
2.2K0
监控 Kubernetes 集群证书过期时间的三种方案
Kubernetes(k8s)-Ingress介绍&安装
作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
运维小路
2025/01/15
3980
Kubernetes(k8s)-Ingress介绍&安装
kubernetes(十三) k8s 集群监控
Prometheus(普罗米修斯)是一个最初在SoundCloud上构建的监控系统。自2012年成为社区开源项目,拥有非常活跃的开发人员和用户社区。为强调开源及独立维护,Prometheus于2016年加入云原生云计算基金会(CNCF),成为继Kubernetes之后的第二个托管项目。
alexhuiwang
2020/09/23
1.5K0
kubernetes(十三) k8s 集群监控
Prometheus Operator与kube-prometheus之二-如何监控1.23+ kubeadm集群
•系列文章: 标签 - Prometheus - 东风微鸣技术博客 (ewhisper.cn)[1]•Prometheus Operator 的上一篇: Prometheus Operator 与 kube-prometheus 之一 - 简介 - 东风微鸣技术博客 (ewhisper.cn)[2]
东风微鸣
2022/12/01
7240
Prometheus Operator与kube-prometheus之二-如何监控1.23+ kubeadm集群
DCGM:监控Kubernetes集群的GPU资源
<Kubelet从入门到放弃>系列将对Kubelet组件由基础知识到源码进行深入梳理。因上篇文章Kubelet从入门到放弃系列:GPU加持中介绍了Nvidia系列GPU如何加持Kubernetes,我们除了关注GPU资源的使用,也关注GPU资源的管理,因此本文推出 Kubernetes集群中如何监控GPU资源。
zouyee
2021/03/23
4.8K0
Kubernetes(k8s)-Prometheus安装
作者介绍:简历上没有一个精通的运维工程师。下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
运维小路
2025/03/27
2270
Kubernetes(k8s)-Prometheus安装
(3 / 3)CentOS搭建K8s微服务20条
k8s第三方资源监控资源展示平台、Prometheus(数据收集)、Grafana(数据展示)
老张的哲学
2023/01/09
5970
云原生实践总结
CLOUD NATIVE LANDSCAPE https://cncf.landscape2.io/?group=projects-and-products
SRE运维进阶之路
2024/04/23
2140
云原生实践总结
一文搞懂基于 Helm 部署 Prometheus Stack 全家桶
Hello folks! 今天我们介绍一下基于 Helm 快速部署安装 Prometheus Stack 的文章,在本文中,我们将讨论 Prometheus 和 Grafana,以及如何使用 Helm 图表为任何 Kubernetes 集群设置监控。我们还将学习如何将 Prometheus 和 Grafana 连接在一起,并在 Grafana 上设置一个基本的仪表板来监控 Kubernetes 集群上的资源。
Luga Lee
2023/02/14
5.5K3
一文搞懂基于 Helm 部署 Prometheus Stack 全家桶
kubernetes监控-prometheus(十六)
通过各种exporter采集不同维度的监控指标,并通过Prometheus支持的数据格式暴露出来,Prometheus定期pull数据并用Grafana展示,异常情况使用AlertManager告警。
yuezhimi
2020/09/30
8280
kubernetes监控-prometheus(十六)
kubernetes(十六) k8s 弹性伸缩
常规的做法是给集群资源预留保障集群可用,通常20%左右。这种方式看似没什么问题,但放到Kubernetes中,就会发现如下2个问题。
alexhuiwang
2020/09/23
3.9K0
kubernetes(十六) k8s 弹性伸缩
Kubernetes微服务监控体系
监控系统是运维体系乃至整个软件产品生命周期中最重要的一环,完善的监控可以帮助我们事前及时发现故障,事后快速追查定位问题。而在以微服务为代表的云原生架构体系中,系统分为多个层次,服务之间调用链路复杂,系统中需要监控的目标非常多,如果没有一个完善的监控系统就难以保证整体服务的持续稳定。
用户5927304
2020/12/11
1.9K0
Kubernetes微服务监控体系
k8s-1.30.1版本一站式部署监控服务
官网:https://kubecm.cloud/zh-cn/introduction
希里安
2024/07/25
1930
k8s-1.30.1版本一站式部署监控服务
使用 OpenTelemetry Collector 采集 Kubernetes 指标数据
Kubernetes 已成为一个被广泛采用的行业工具,对可观测性工具的需求也在不断增加。为此,OpenTelemetry 创建了许多不同的工具,来帮助 Kubernetes 用户观察他们的集群和服务。
我是阳明
2023/09/11
2.4K0
使用 OpenTelemetry Collector 采集 Kubernetes 指标数据
Helm 安装 Kubernetes 监控套件
Helm 安装 Grafana Prometheus Altermanager 套件安装helm# 安装helm工具curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3chmod 700 get_helm.sh./get_helm.sh下载离线包# 添加 prometheus-community 官方Helm Chart仓库helm repo add prometheus-c
小陈运维
2023/02/15
1.2K0
玩转容器的正确姿势:我的 Kubernetes 编排最佳实践指南
说到容器,大家第一个想到的肯定是 Docker;但如果你的容器多到数不过来,一个个手动管肯定是不行的,这时候Kubernetes(简称 K8s)就登场了。
Echo_Wish
2025/04/28
1990
玩转容器的正确姿势:我的 Kubernetes 编排最佳实践指南
Gitlab CI 集成 Kubernetes
首先将本节所用到的代码库从 Github 上获得:cnych/gitlab-ci-k8s-demo,可以在 Gitlab 上新建一个项目导入该仓库,当然也可以新建一个空白的仓库,然后将 Github 上面的项目 Clone 到本地后,更改远程仓库地址即可:
jwangkun
2021/12/23
1.7K0
Gitlab CI 集成 Kubernetes
微服务监控神器Prometheus的安装部署
Prometheus提供了容器和云原生领域数据搜集、存储、处理、可视化和告警一套完整的解决方案,最初时是由SoundCloud公司开发的。自2012年开源以来社区成员就不断递增。如今的Prometheus已经发展到继Kubernetes后第2个正式加入CNCF基金会的项目
Java学习录
2019/05/21
9760
微服务监控神器Prometheus的安装部署
kubernetes(k8s) 安装 Prometheus + Grafana
MetricServer:是kubernetes集群资源使用情况的聚合器,收集数据给kubernetes集群内使用,如 kubectl,hpa,scheduler等。
小陈运维
2022/04/24
1.7K1
EggJS 云原生应用硬核实战(Kubernetes+Traefik+Helm+Prometheus+Grafana)
这是一个关于 Egg.js 应用上云☁️的示例,笔者所在的大前端团队的已应用于生产。
为少
2021/05/27
7630
EggJS 云原生应用硬核实战(Kubernetes+Traefik+Helm+Prometheus+Grafana)
推荐阅读
相关推荐
监控 Kubernetes 集群证书过期时间的三种方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档