首页 > 系统相关 >shell编程

shell编程

时间:2024-07-27 17:27:04浏览次数:14  
标签:shell 变量 shall 编程 echo sh root

一、shell基础


1.shell概念


shell 英文翻译过来是外壳的意思,作为计算机语言来理解可以认为它是操作系统的外壳。可以通过shell 命令来操作和控制操作系统,比如Linux中的shell命令就包括 ls、cd、pwd 等等。
shell 在内核的基础上编写的一个应用程序,它连接了用户和 Linux 内核,从而让用户能够更加便捷、高效、安全的使用 linux 内核,这其实就是 shell 的本质。
使用专业术语的说法来解释,Shell 其实是一个命令解释器,它通过接受用户输入的 Shell 命令来启动、暂停、停止程序的运行或对计算机进行控制。
shell通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出,简单来说shell就是一个用户跟操作系统之间的一个命令解释器
常见的shell:
Bourne Shell (/usr/bin/sh或/bin/sh)
Bourne Again Shell (/bin/bash)
C Shell (/usr/bin/csh)
K Shell (/usr/bin/ksh)
Shell for Root (/sbin/sh)

2.shell脚本


shell脚本就是由Shell命令组成的执行文件,将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行,它从一定程度上减轻了工作量,提高了工作效率,还可以批量、定时处理主机,方便管理员进行设置或者管理。

3.shell脚本编写注意事项


shell命名: shell脚本名称命名一般为英文、大写、小写、后缀以.sh结尾
不能使用特殊符号、空格
名称要写的一眼可以看出功能,也就是顾名思义 
shell脚本首行需要#!/bin/bash开头
shell脚本变量不能以数字、特殊符号开头,可以使用下划线 _,但不能用破折号——

二、编写shell脚本


1.编写hello world

[root@shall ~]# vim a.sh 
#!/bin/bash
echo "Hello word"
执行shell脚本的几种方法:
1)
[root@shall ~]# bash a.sh
Hello word
2)
[root@shall ~]# chmod +x a.sh 
[root@shall ~]# ./a.sh 
Hello word
3)
[root@shall ~]# source a.sh 
Hello word
4)
[root@shall ~]# sh a.sh 
Hello word

2.编写nginx安装脚本

[root@shall src]# mkdir -p /root/shell/
[root@shall src]# vim /root/shell/install_nginx.sh
#!/bin/bash
yum -y install gcc gcc-c++ make pcre-devel openssl-devel wget
cd /usr/local/src/
wget 'https://nginx.org/download/nginx-1.22.1.tar.gz'
tar -xf nginx-1.22.1.tar.gz
cd nginx-1.22.1
./configure --prefix=/usr/local/nginx
make -j 4
make install
[root@shall src]# sh /root/shell/install_nginx.sh
[root@shall src]# nginx

3.
[root@shall src]# vim b.sh
#!/bin/bash
useradd $1
echo $2|passwd --stdin $1
[root@shall src]# bash b.sh xxxx dwa
更改用户 xxxx 的密码 。
passwd:所有的身份验证令牌已经成功更新。

4.
[root@shall src]# vim d.sh
#!/bin/bash
num1=3
num2=4

if [ $num1 -eq $num2 ];then
   echo "两个数字相等"
else
   echo "两个数字不相等"
fi
[root@shall src]# sh d.sh 
两个数字不相等

5.
[root@shall src]# vim e.sh
#!/bin/bash
read -p "请输入要测试的网址:" web        # read:命令行内输入web的变量值
ping -c 3 $web &> /dev/null        # ping -c 3,连接某个网站三次
if [ $? -eq 0 ];then        # 如果ping命令执行成功,那么
         echo "此时网络畅通!"    # 输出“此时网络畅通”
else    # 否则
         echo "无法访问,请检查网址是否输入正确或检查相关的网络配置!"        # 输出“无法访问...”
fi        # if语句的结尾
[root@shall src]# sh e.sh 
请输入要测试的网址:www.baidu.com
此时网络畅通!

6.
[root@shall src]# vim f.sh
#!/bin/bash
read -p "请输入账号" user
if [ $user == "admin" ];then
           echo "欢迎登录,$user"
else
           echo "账号或密码错误"
fi
[root@shall src]# sh f.sh 
请输入账号sw
账号或密码错误
[root@shall src]# sh f.sh 
请输入账号admin
欢迎登录,admin

四、变量


1.概念


变量用来存放系统或用户需要使用的特定参数或者值,变量的值可以根据用户设定或者系统环境变化而相应变化,在Shell脚本中使用变量,可使脚本更加灵活,适应性更强。
与变量相对应的是常量,常量例如“Hello World”,是不可改变的。
变量可以给个变量名,假如为name,值是可变的。

2.变量注意事项


变量命名规则:必须由大写字母、小写字母、下划线、数字,并且首字母不能是数字
在变量命名时:建议也简写出该变量是什么用处
变量值的类型:值的类型会分为整型、浮点型、字符串型、布尔型等,而且使用变量需要指定类型Shell 默认的变量类型都是字符串,无需指定类型。

3.变量的分类


(1)自定义变量


由用户自己定义、使用和修改

[root@shall ~]# A=1314                       //左边是变量,右边是值
[root@shall ~]# echo $A
1314
[root@shall ~]# unset A                       //清除变量
[root@shall ~]# echo $A

变量名=值中,等于号=之前和之后不能有空格,比如:name = yang,这样是错的,name=yang 才对
变量名=值中,值内如果输入数学算式,是没办法算出结果的,只会输出字符串。

(2)环境变量


由系统维护,用于设置工作环境
$PWD
$SHELL
$USER
$PATH

[root@shall ~]# env                //查看所有的环境变量
[root@shall ~]# echo $PWD
/root
[root@shall ~]# echo $SHELL
/bin/bash
[root@shall ~]# echo $USER
root
[root@shall ~]# echo $PATH
/usr/local/redis269/bin/:/usr/local/mongodb/bin/:/usr/local/python3124/bin/:/opt/apache-maven-3.9.8/bin/:/usr/local/jdk/jdk-17.0.11/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
其中PATH变量用于设置可执行程序的默认搜索路径,可以修改全局变量文件/etc/profile 或修改某用户家目录下的~/.bash_profile文件永久改变环境变量。

(3)位置变量


通过命令行给脚本程序传递参数 (也属于预定义变量)
为了在使用Shel脚本程序时,方便通过命令行为程序提供操作参数,Bash引入了位置变量的概念位置变量有 n,n为1~9之间的数字
$0:第一个字段表示命令名或脚本名称
$1:脚本要处理的第一个参数
$2:脚本要处理的第二个参数
……
Shell脚本最多可以直接处理9个参数

[root@shall ~]# vim g.sh
#!/bin/bash
ifconfig $1 | grep -w inet | awk '{print $2}'
[root@shall ~]# sh g.sh 
192.168.1.100
192.168.2.100
192.168.3.100
127.0.0.1

(4)预定义变量


Bash中内置的一类变量,不能直接修改
预定义变量是Bash程序预先定义好的一类特殊变量,用户只能使用预定义变量,而不能创建新的预定义变量,也不能直接为预定义变量赋值。
$*  :将所有参数作为整体
$@:单个参数的组合,每个参数占一行
$0  :保存了脚本名称
$?  :保存命令或脚本的执行状态码
$# :保存脚本要处理的参数的个数

[root@shall ~]# vim h.sh 
#!/bin/bash
for x in "$*"
do
  echo $x
done
for y in "$@"
do
  echo $y
done
[root@shall ~]# sh h.sh 1 2 3 4 5 6
1 2 3 4 5 6                    //$*的结果
1                                  
2
3
4
5
6                                   //$@的结果

4.变量的定义与输出


(1)定义一个新的变量


格式:变量名=变量值
注意:变量名必须以字母或下划线开头,严格区分大小写

(2)变量符号运用


双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值,$视为普通字符
反撇号:”`“或$(): 命令替换,提取命令的执行结果

[root@shall ~]# X=aaa
[root@shall ~]# echo "$X"
aaa
[root@shall ~]# echo '$X'
$X
[root@shall ~]# ip1=`ifconfig ens33 | grep -w inet | awk '{print$2}'`
[root@shall ~]# ip2=$(ifconfig ens33 | grep -w inet | awk '{print$2}')
[root@shall ~]# echo $ip1
192.168.1.100
[root@shall ~]# echo $ip2
192.168.1.100
[root@shall ~]# x=100
[root@shall ~]# y=50
[root@shall ~]# z=`expr $x + $y`                 //整数运算
[root@shall ~]# echo $z
150
[root@shall ~]# x=1.4
[root@shall ~]# expr $x + 1                           //判断是否为浮点数
expr: 非整数参数
[root@shall ~]# [ $? -ne 0 ] && echo "x为浮点数"
x为浮点数

(3)输入与输出


输入格式:read [-p "显示的提示信息"] 变量名
输出格式:echo $变量名

[root@shall ~]# read x y
1 3
[root@shall ~]# echo $x $y
1 3
[root@shall ~]# read -p "请输入你要赋值的变量值" x y
请输入你要赋值的变量值1 5
[root@shall ~]# echo $x $y
1 5

5.变量的作用范围


默认情况下,新定义的变量只在当前Shell环境中有效,因此称为局部变量。当进入子程序或新的子shell 时,局部变量将无法再使用。
为了使用户定义的变量在所有子Shell环境中能够继续使用,减少重复设置工作,可以通过内部命令export将指定的变量导出为“全局变量”。
格式 1:export 变量名
格式 2:export 变量名=值


6.变量的数学运算

(1)整数运算
格式:expr 变量1 运算符 变量2  运算符 变量3....
运算符:+ - * /(+ - × ÷)

[root@shall ~]# x=123
[root@shall ~]# y=111
[root@shall ~]# expr $x + $y               //加
234
[root@shall ~]# expr $x - $y                //减
12
[root@shall ~]# expr $x \* $y              //乘
13653
[root@shall ~]# expr $x / $y                //除
1
[root@shall ~]# expr $x % $y               //取余
12

(2)精度计算
[root@shall ~]# yum -y install bc                   //精度计算之前,必须先安装bc这个软件,否则只能进行整数运算
[root@shall ~]# echo "scale=5; $x / $y" | bc
1.10810
 

标签:shell,变量,shall,编程,echo,sh,root
From: https://blog.csdn.net/m0_73671133/article/details/140723625

相关文章

  • FrameBuffer 应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
    FrameBuffer应用编程什么是Framebuffer设备Framebuffer定义:Framebuffer是帧缓冲,指一块内存,用于保存一帧图像Linux系统中的Framebuffer:在Linux系统中,Framebuffer是一种显示驱动接口,抽象并屏蔽了不同显示设备的硬件细节,对应用层提供了一块显示内存(显存)Framebuf......
  • 基于宝塔面板的雨云自动签到shell脚本教程(亲测可用)
    第一步:雨云API获取    ①登录雨云用户后,鼠标移到用户头像    ②在出来的菜单中点击“账户设置”    ③在页面中找到左边一栏,点击“API密钥”    ④若之前没有使用过API密钥,右边的栏会是空的,那就点击右边橘黄色的“重新生成”按钮  ......
  • Linux系统编程——进程
    学习目标:学习内容:1.进程的含义?进程是一个程序执行的过程,会去分配内存资源,cpu的调度pcb  是一个结构体,process control block print circuit boardvim -ttask_struct PID,进程标识符当前工作路径   chdirumask  0002进程打开的文件列表  文件IO中......
  • shell脚本学习以及案列练习
    (一)用shell脚本自动化部署安装nginx首先创建一个目录,用于存放该脚本 mkdir-p/root/shell然后创建脚本文件vim/root/shell/install_nginx.sh再给脚本文件加上执行权限 chmod+x /root/shell/install_nginx.sh然后执行,就可自动安装nginx了到这里就编译成功了(二)s......
  • Mojo AI编程语言(十二)高级特性:深入理解Mojo
    目录1.Mojo简介2.高级数据类型2.1数组与矩阵2.2多维数组2.3字符串操作3.并行计算3.1线程与协程3.2并行算法4.分布式系统4.1RPC与消息传递4.2分布式数据处理5.高级语言特性5.1泛型编程5.2函数式编程5.3元编程6.错误处理与调试6.1错误处理6.2......
  • QT网络编程(二)——TCP协议工作原理及实战
    目录引言一、TCP协议基础知识1.TCP协议特点2.TCP连接的三个阶段3.三次握手和四次挥手二、Qt中的TCP编程1.引入Qt网络模块2.QTcpServer类常用函数3.QTcpSocket类常用函数三、TCP网络通信流程TCP服务器TCP客户端四、实战示例UI界面核心代码运行结果......
  • 零基础STM32单片机编程入门(二十二) ESP8266 WIFI模块实战含源码
    文章目录一.概要二.ESP8266WIFI模块主要性能参数三.ESP8266WIFI模块芯片内部框图四.ESP8266WIFI模块原理图五.ESP8266WIFI模块与单片机通讯方法1.硬件连接2.ESP8266模块AT指令介绍六.STM32单片机与ESP8266WIFI模块通讯实验1.硬件准备2.软件工程3.软件主要代码4.实验......
  • Mistral新旗舰决战Llama 3.1,最强开源Large 2 123B,扛鼎多语言编程全能王
    【新智元导读】紧跟着Meta的重磅发布,MistralLarge2也带着权重一起上新了,而且参数量仅为Llama3.1405B的三分之一。不仅在编码、数学和多语言等专业领域可与SOTA模型直接竞争,还支持单节点部署。昨天正式发布的Llama3.1模型,让AI社区着实为之兴奋。但是仔细一想就能发现......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(3)
    Preface徐神是我们的红太阳,最后2min切了一道极难的string使得在这场前期爆炸的局面最后没有崩得太难看这场前期的开题顺序有点问题导致前5题出的很慢,中后期开始三人一人写一题,然后经典三开三卡好在最后我在WA了五发后写对拍把B过了,徐神又压线过了string,但比较可惜的......
  • Shell脚本编程(二)
    目录一、Shell程序中使用变量1、变量赋值2、访问变量值3、键盘输入变量值4、实例15、实例2二、表达式的比较1、字符串比较1.1、实例11.2、实例22、数字比较2.1、实例13、逻辑操作3.1、实例14、文件操作4.1、实例14.2、实例2一、Shell程序中使用变量1、变量......