Linux 之八:Linux 的 Shell 编程

简介

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务

Shell 脚本

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

日常所说的 shell 通常都是指 shell 脚本,但其实 shell 和 shell script 是两个不同的概念。

Shell 解释器

Shell 编程只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Linux 的 Shell 种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)

Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。

在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash

Hello,Shell

我们第一个 Shell 也从 Hello,World! 开始吧!面向world 编程嘛!!

在自己练习的目录下,新建 hello.sh 文件敲入下面内容,并修改权限为可执行。

#!/bin/bash

echo "Hello,World! My Shell!"

[root@wang shell]# vim hello.sh
[root@wang shell]# chmod u+x hello.sh     # 修改改可执行文件
[root@wang shell]# ./hello.sh            # 执行脚本
Hello,World! My Shell!                    # 显示输出内容
[root@wang shell]# 

Shell 变量

定义变量时,变量名不加美元符号($),如:

your_name="zhangpeng"

注意,变量名和等号之间不能有空格。同时,变量名的命名须遵循如下规则:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线 _
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

简单使用

[root@wang shell]# name=zhangpeng
[root@wang shell]# echo $name
zhangpeng
[root@wang shell]# echo ${name}                # 定义变量边界
zhangpeng
[root@wang shell]# echo my name is ${name}    # 有了边界 ${name}ToUpper    后面有其他字母也可能识别
my name is zhangpeng

常量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

下面的例子尝试更改只读变量,结果报错:

#!/bin/bash
pi=3.14
readonly myUrl
pi=5
[root@wang shell]# pi=3.14
[root@wang shell]# readonly pi        # 设置为只读
[root@wang shell]# pi=5
bash: pi: readonly variable
[root@wang shell]# 

删除变量

使用 unset 命令可以删除变量

unset varname

[root@wang shell]# age=34
[root@wang shell]# echo $age
34
[root@wang shell]# unset age        # 设置变量无效 删除变量
[root@wang shell]# echo $age        # 再次查看 没有结果[root@wang shell]# 

变量类型

shell 中有三种变量:

1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。

2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。

3) shell 变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

字符串

字符串应该是多数程序中最常用的类型了,shell 也不例外!

shell 中使用单引号和双引号都可以表示字符串,甚至不使用引号也可以。

注意:shell 单引号和双引号使用上还是有区别的

[root@wang shell]# name=zhangpeng                # 没使用双引号的字符串
[root@wang shell]# echo $name                    
zhangpeng
[root@wang shell]# echo 'my name is $name'        # 单引号中引用变量无效
my name is $name
[root@wang shell]# echo "my name is $name"        # 双引号中可以引用变量
my name is zhangpeng
[root@wang shell]# echo 'my name is' $name        # 单引号可以拼接变量 这样是可以的
my name is zhangpeng
[root@wang shell]# 

单引号字符串的限制:

  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符
字符串长度

#井号 可以求长度

[root@wang shell]# name=zhangpeng
[root@wang shell]# echo ${#name}
9
截取子串

${name:start:count}

[root@wang shell]# echo ${name:0}    # 从0开始截取到结尾
zhangpeng
[root@wang shell]# echo ${name:1}
hangpeng
[root@wang shell]# echo ${name:3:1} # 从3开始截取到1个字符
n
替换
[root@wang shell]# echo ${name/n/x}        # 替换第一个匹配字符串
zhaxgpeng
[root@wang shell]# echo ${name//n/x}    # 两个斜杠替换所有的匹配字符串
zhaxgpexg
[root@wang shell]# 
删除
[root@wang shell]# name=Test.java
[root@wang shell]# echo ${name%.java}   # 以.java 结尾则删除,否则原样输出
Test
[root@wang shell]# 

${parameter} 返回变量$parameter的内容 ${#parameter} 返回变量$parameter的内容长度,适用于特殊变量 ${parameter:offest} 返回变量$parameter中,从offest位置后到结尾的字符串 ${parameter:offest:length} 返回变量$parameter中,从offest位置后提取长度为length的字符串 ${parameter#word} 返回变量$parameter中,开头开始删除最短匹配的word字符串 ${parameter##word} 返回变量$parameter中,开头开始删除最长匹配的word字符串 ${parameter%word} 返回变量$parameter中,结尾开始删除最短匹配的word字符串 ${parameter%%word} 返回变量$parameter中,结尾开始删除最长匹配的word字符串 ${parameter/word/strinng} 使用string替换第一个匹配的word ${parameter//word/strinng} 使用string替换匹配的所有的word

注释

以 # 开头的行就是注释,会被解释器忽略。

通过每一行加一个 # 号设置多行注释,像这样:

#--------------------------------------------
# 这是一个注释
#--------------------------------------------

多行注释

多行注释还可以使用以下格式:

:<<EOF
注释内容...
注释内容...
注释内容...
EOF

接收输入

read varname # 程序阻塞,等待用户输入,输入的值,赋值给 varname 变量

      1 echo "请输入您的年龄:"2 read age3 echo "请输入您姓名:"4 read name5 echo "您输入的姓名是${name},年龄是${age}"

算术运算

[root@wang shell]# num1=3
[root@wang shell]# num2=4
[root@wang shell]# expr $num1+num2
3+num2
[root@wang shell]# expr $num1+$num2
3+4
[root@wang shell]# echo $[num1-num2]
-1
[root@wang shell]# echo $[num1+num2]
7
[root@wang shell]# echo $((num1+num2))
7

let 运算符

echo "请输入第一个数:"
read num1
echo "请输入第二个数:"
read num2
let result=num1+num2
echo "$num1+$num2=$result"

if - else 语句

echo "请输入您的考试成绩:"
read scoreif [ $score -ge 60  ]then echo "恭喜,及格了!"
elseecho "下次补考吧!";
fi

if-elif-else

echo "请输入您的考试成绩:"
read score
if [ $score -ge 90  ]then echo "优秀"
elif [ $score -ge 80 ]then echo "良好"
elif [ $score -ge 60 ]then echo "一般"
elseecho "差评"
fi

case

case $1 in
1) #必须带右边括号
echo "星期一"
;; #相当于break
2)
echo "星期二"
;;
*) #相当于default
echo "输入错误"
;;
esac

合并

echo "请输入今天星期几"
read week
case $week in
1 | 2 | 3 | 4 | 5)
echo "工作!"
;;
6 | 7)
echo "休息"
;;
*)
echo "输入错误"
;;
esac

for

for i in 1 3 5 7 9
doecho $i
done

双括号简化

sum=0for((i=1;i<=100;i++)) 
do let sum=sum+i
done
echo "1+2+3+..+100=$sum"

while

i=1
sum=0
while ((i<=100))
dolet sum+=i;let i++; 
done
echo "sum=$sum"

应用

根据条件创建目录

for (( i=0;i<10;i++ ))
doif [ $(($i%2)) -eq 0 ]then mkdir user$ifidone
echo "目录创建成功"

根据当前日期创建目录

y=$(date +%Y);
m=$(date +%m);
d=$(date +%d);
dir="${y}/${m}/${d}";
mkdir -p $dir;
echo "${dir}创建成功!"

批量删除目录

for f in /root/test/*
doif [[ $f == *a* ]]then rm -rf $f   fi
done

模仿 ls 命令列出当前目录下文件的功能,使用 shell 脚本实现我们自己的 list 列表功能

第一步:vi myls.sh

      1 for f in *   # 当前目录下所有的文件集合2 do3         echo "${f}"4 done

默认使用方式:需要使用 ./ 的方式调用

[root@wang opt]# ./shell/ls.sh  ## 可以实现列出pwd 当前目录下文件
apache-tomcat-9.0.52
apache-tomcat-9.0.52.tar.gz
dump.rdb
mydir

如果想在任何地方直接调用shell 脚本,可以把文件拷贝到 /usr/local/bin 即可

[root@wang shell]# cp myls.sh /usr/local/bin
[root@wang shell]# myls.sh   ### 再次直接调用 ,可以了
add.sh
case0.sh
case2.sh

最后,再重命名,把myls.sh 重名为 myls

[root@wang bin]# mv myls.sh myls
[root@wang bin]# ls            ## 系统命令
dump.rdb  redis1.conf  redis3.conf      redis-check-aof  redis-cli   redis-sentinel  sentinel.conf
myls      redis2.conf  redis-benchmark  redis-check-rdb  redis.conf  redis-server
[root@wang bin]# myls        ## 自己的命令
dump.rdb
myls
redis1.conf
redis2.conf

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

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

相关文章

云原生应用架构-微服务开发最佳实践

第1章云原生时代下的微服务 微服务架构是一种将单个应用程序开发为一组小型服务的方法&#xff0c;每个服务在自己的进程中运行&#xff0c;并通过轻量级的通信机制&#xff08;如HTTP API&#xff09;进行交互。这些服务围绕业务功能构建&#xff0c;可以通过完全自动化的部署…

单链表的基本操作--增删改查

增删改查 #include <stdio.h> #include <stdlib.h>#define OK 1 #define ERROR 0 typedef int Status; typedef char ElemType;typedef struct Lnode {ElemType data; //结点的数据域struct Lnode* next; //节点的指针域 }Lnode,*LinkList;初始化 Status InitLis…

【PCL】(二十八)超体素聚类分割点云

&#xff08;二十九&#xff09;超体素聚类分割点云 论文&#xff1a;Voxel Cloud Connectivity Segmentation - Supervoxels for Point Clouds supervoxel_clustering.cpp #include <pcl/console/parse.h> #include <pcl/point_cloud.h> #include <pcl/poin…

重启 explorer 进程的正确做法(二)

重启资源管理器进程的方法不唯一&#xff0c;但长期以来大家对实施方法用的不到位。 在上一篇中我认为&#xff1a;“我们往往使用 TerminateProcess 并传入 PID 和特殊结束代码 1 或者 taskkill /f /im 等方法重启资源管理器( explorer.exe )&#xff0c;其实这是不正确的。我…

21 卷积层里的多输入多输出通道【李沐动手学深度学习v2课程笔记】

目录 1. 多输入输出通道&相应代码实现 1.1 多输入 1.2 多输出 1.3 1x1 卷积层 1.4 小结 1. 多输入输出通道&相应代码实现 1.1 多输入 为了加深理解&#xff0c;我们实现一下多输入通道互相关运算。 简而言之&#xff0c;我们所做的就是对每个通道执行互相关操作&a…

CentOS 8启动流程

一、BIOS与UEFI BIOS Basic Input Output System的缩写&#xff0c;翻译过来就是“基本输入输出系统”&#xff0c;是一种业界标准的固件接口&#xff0c;第一次出现在1975年&#xff0c;是计算机启动时加载的第一个程序&#xff0c;主要功能是检测和设置计算机硬件&#xff…

题目:泡澡(蓝桥OJ 3898)

问题描述&#xff1a; 解题思路&#xff1a; 图解&#xff1a;&#xff08;以题目样例为例子&#xff09; 注意点&#xff1a;题目的W是每分钟最大出水量&#xff0c;因此有一分钟的用水量大于出水量则不通过。 补充&#xff1a;差分一般用于对一段区间每个元素加相同值&#x…

JZ76 删除链表中重复的结点

/*public class ListNode {int val;ListNode next null;ListNode(int val) {this.val val;} } */import java.util.*; public class Solution {public ListNode deleteDuplication(ListNode pHead) {//初步想想法&#xff1a; 弄一个hashmap 然后进行key存储起来。然后 如果存…

PHP将PDF转成多个PNG文件

1. 安装Imagick之前&#xff0c;您需要确保已安装PHP。如果您尚未安装PHP&#xff0c;请运行以下命令安装PHP及其常用扩展&#xff1a; sudo apt install php php-cli php-imagick 2. 安装Imagick PHP扩展&#xff1a; sudo apt install php-imagick 3.安装后&#xff0c;您…

python 查询json文件的某一行并 替换json 键值字符串右边的内容

在Python中处理JSON文件时&#xff0c;通常不需要按照行来查询和替换内容&#xff0c;因为JSON数据结构是键值对组成的&#xff0c;并且不以“行”为单位。你可以直接读取整个JSON文件&#xff0c;解析成字典对象&#xff0c;然后根据键名查找并修改对应的值。 以下是一个示例…

hibernate查询时会无限循环,然后报错:Exception in thread “main“ java.lang.StackOverflowError

遇到的情况有&#xff1a; 1、建表对应的时候“意外”添加了索引。解决&#xff1a;需要把索引删掉 2、打印查询到的单个实体信息时&#xff0c;使用了toString()方法。解决&#xff1a;不用就行了 3、多对多映射&#xff0c;查询到的整个实体集合时&#xff0c;直接打印这个…

web前端框架

目前比较火热的几门框架: React React是由Facebook(脸书)开发和创建的开源框架。React 用于开发丰富的用户界面&#xff0c;特别是当您需要构建单页应用程序时。它是最强大的前端框架。 弊端: 您不具备 JavaScript 的实践知识&#xff0c;则建议不要使用 React。同样&#x…

2024 年广东省职业院校技能大赛(高职组) “云计算应用”赛项样题①

2024 年广东省职业院校技能大赛&#xff08;高职组&#xff09; “云计算应用”赛项样题① 模块一 私有云&#xff08;50 分&#xff09;任务 1 私有云服务搭建&#xff08;10 分&#xff09;任务 2 私有云服务运维&#xff08;25 分&#xff09;任务 3 私有云运维开发&#xf…

人工智能(AI)领域最流行的八大算法概括

人工智能&#xff08;AI&#xff09;领域最流行的八大算法概括&#xff01; 1. 卷积神经网络&#xff08;CNN&#xff0c;Convolutional Neural Network&#xff09; 2. 图神经网络&#xff08;GNN&#xff0c;Graph Neural Network&#xff09; 3. 循环神经网络&#xff08;RN…

蓝桥杯第一天

这题就是典型的位数贡献大于数量贡献&#xff0c; 1花的火柴更少&#xff0c;所以尽量用完10个1&#xff0c;然后其实就是简单的背包问题尽量拿最多的物品&#xff08;数字&#xff09;&#xff0c;限重为300&#xff0c;各物品&#xff08;数字&#xff09;的重量即为所需火柴…

vue2的常用指令

什么是vue的内置指令 内置指令的一些新颖而有吸引力的用法&#xff0c;可以让您在开发中能加速开发效率,降低维护成本。 v-bind和v-model v-bind&#xff1a; 使用 v-bind 可以动态地绑定一个或多个特性&#xff0c;或者一个组件 prop 到表达式。可以使用简化语法 : 来代替 …

php文件操作

一、文件读取的5种方法 1&#xff0c;file_get_contents: 将整个文件读入一个字符串 file_get_contents( string $filename, bool $use_include_path false, ?resource $context null, int $offset 0, ?int $length null ): string|false 可以读取本地的文件也可以用来打…

Python语言元素之变量

程序是指令的集合&#xff0c;写程序就是用指令控制计算机做我们想让它做的事情。那么&#xff0c;为什么要用Python语言来写程序呢&#xff1f;因为Python语言简单优雅&#xff0c;相比C、C、Java这样的编程语言&#xff0c;Python对初学者更加友好。 一、一些计算机常识 在…

【Apache的安装与目录结构】讲解

Apache的安装与目录结构 0. 前言1. 安装Apache1.1 在Ubuntu/Debian上安装Apache1.2 在CentOS/Red Hat/Fedora上安装Apache1.3 在Windows上安装Apache1.4 在Mac OS X上安装Apache 2. Apache目录结构 0. 前言 Apache HTTP Server&#xff0c;简称Apache&#xff0c;是一个开源的…

储能系统--户用储能欧洲市场(三)

五、户用市场地域分析 2022年以来&#xff0c;全球能源供需格局进入调整阶段&#xff0c;越来越多的国家将储能列为加速其清洁能源转型的必选项。根据中关村储能产业技术联盟 &#xff08;CNESA&#xff09;数据&#xff0c;2022年全球新增投运电力储能项目装机规模30.7GW&…