sheel脚本

2023-11-12

sheel脚本

sheel脚本

sheel脚本的工作方式有两种:交互式和批处理

  • 交互式:用户输入一条就立即执行
  • 批处理:由用户实现编写好一个完整的sheel脚本,sheel会一次执行脚本中诸多命令

脚本中不仅会用到一般的linux命令、管道符、重定向,还需要把内部功能模块后通过逻辑语句进行处理,最终形成日常使用的脚本。

2 、编写简单的脚本

实际上,使用vim将命令写入到一个文件中,就是一个简单的脚本了。

#! /bin/bash
# this is a demo

pwd
ls

sheel 脚本的名称可以任意,但是为了区分,一般以.sh后缀,来表名这是一个脚本文件。

一般脚本的第一行脚本声明 #! 用来告诉系统使用哪种解释器来执行该脚本

第二行是对该脚本的注释信息,以便让后来使用脚本的人了解该脚本的功能或警告信息。

之后是脚本的命令

另外也可以通过脚本的路径来执行脚本。

3、脚本参数

实际上,脚本文件可以接受参数,每个参数以空格隔开

1、$0 代表当前脚本的名称

2、$N 代表N个参数,如$1为第一个参数,$2为第二个参数…

3、$*为所有得到参数

4、$? 为上一次命令执行的返回值

#! /bin/bash
# this a example scrip to demostrate the usage of arguments

echo the name of this script is $0
echo tht first of this script is $1
echo this second of this script is $2
echo there are $# arguments totally,the $*

[root@iZwz91wmx1ifron6bg7zccZ jiaobenDemo]# bash example.sh 
the name of this script is example.sh
tht first of this script is
this second of this script is
there are 0 arguments totally,the

4 、脚本参数的判断

系统可以对用户输出的参数进行判断和测试,按照测试对象划分,测试语句可以分为四种:

4.1 文件测试语句

用来判断文件是否存在或权限是否满足等情况的运算符,具体用法如下

运算符 作用
-d 测试文件是否目录
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行

测试 /etc/fstab 是否为一个目录类型的文件,然后通过sheel解释器内设的$? 来显示上一条命令的执行结果。如果返回值为0,则存在,非0值,则不存在。

[root@iZwz91wmx1ifron6bg7zccZ jiaobenDemo]# [ -d /etc/fstab ]
[root@iZwz91wmx1ifron6bg7zccZ jiaobenDemo]# echo $?
1

[ 与 ] 本身也是命令,所以要空格隔开

4.2 逻辑测试语句

逻辑语句对于测试结果进行逻辑分析,可根据测试结果可以实现不同的效果。

4.2.1 并 &&

逻辑并标识两者都为真则为真,所以第一条为假则为假,第一条为真时要判断第二句,也就是说, && 前面的语句执行成功才会执行后面的命令。

[root@iZwz91wmx1ifron6bg7zccZ jiaobenDemo]# [ -d /root/jiaobenDemo ] && echo "this file is a directory"
this file is a directory

4.22 或 ||

逻辑或表示有一个为真则为真,所以第一条为真则真,第一条为假时要判断第二句,也就是说,||前面的语句执行为假才会执行后面的命令。

[root@iZwz91wmx1ifron6bg7zccZ jiaobenDemo]# [ -d /root/jiaobenDemo/example.sh ] || echo "this file is not a directory"
this file is not a directory

4.2.3 非 !

它表示把判断结果取相反值。

[root@alliyun jiaobenDemo]# [ ! $USER=root ] && echo "this is not admininstrator"
[root@alliyun jiaobenDemo]# 

4.3 整数值比较语句

由于大于号小于号与定向符号冲突了,所以需要使用整数比较运算符:

运算符 含义
-eq(equal) 等于
-ne(not equal) 不等于
-gt(greater then) 大于
-lt(less than) 小于
-ge(greater than or equal) 大于等于
-le(less than or equal) 小于等于
[root@alliyun jiaobenDemo]#  [ 1 -lt 2 ] && echo "right"
right
[root@alliyun jiaobenDemo]# [ 1 -lt 2 ] && [ 1 -eq 1 ]
[root@alliyun jiaobenDemo]# echo $?
0

4.4 字符串比较语句

字符串的比较语句用于判断测试字符串是否为空值,或者两个字符串是否相同,它经常用来判断某个变量是否被定义(即内容为空值).

运算符 含义
= 字符串内容是否相同
!= 是否不同
-z 判断字符串是否为空,空为真
[root@alliyun jiaobenDemo]# [ ! -z $SHELL ] && echo "this variable exist"
this variable exist

5 脚本的流程控制

尽量上述的测试语句可以完成基本的流程控制,但这并不够灵活,在生产环境中我们需要通过 if、for 、while 、case 四种流程控制语句编写更灵活复杂的脚本。这四个语句逻辑上和其他语言的用法并没有区别,只是语法的区别。

if

测试是否能与主机通信

#!/bin/bash

# determine whether host is online

ping -c 3 $1 &> /dev/null
if [ $? -eq 0 ]
then 
echo "host $1 is online"
else 
echo "host $1 is offline"
fi


[root@alliyun jiaobenDemo]# bash chrhost.sh 
host  is offline
[root@alliyun jiaobenDemo]# bash chrhost.sh 127.0.0.1
host 127.0.0.1 is online

多分支例子,输入分数后输出评价。

#!/bin/bash

# input an interger score,output an evalution

read -p "enter your score(0-100):" GRADE
if [ $GRADE -gt 100 ] || [ $GRADE -lt 0 ]
then echo "score is invalid"
elif [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then echo "excellent"
elif [ $GRADE -ge 60 ] && [ $GRADE -lt 85 ]
then echo "pass"
else
echo "fail"
fi

[root@alliyun jiaobenDemo]# bash chrscore.sh 100
enter your score(0-100):100
excellent
[root@alliyun jiaobenDemo]# bash chrscore.sh
enter your score(0-100):120
score is invalid
[root@alliyun jiaobenDemo]# bash chrscore.sh
enter your score(0-100):-1
score is invalid
[root@alliyun jiaobenDemo]# bash chrscore.sh
enter your score(0-100):40
fail

for

从列表文件中读取多个用户名,然后逐一创建用户账户并设置密码
从列表文件中读取多个用户名,然后逐一创建用户账户并设置密码

[root@alliyun jiaobenDemo]# vim users.txt 
andy
barry
jack
simmen
tracy
[root@alliyun jiaobenDemo]# vim createacount.sh 
#!/bin/bash
# read name then create an acount

read -p "enter the users password:" PASSWD
for UNAME in `cat users.txt`
do 
  id $UNAME &> /dev/null
  if [ $? -eq 0 ]
  then 
  echo "already exists"
  else 
  useradd $UNAME &> /dev/null
  echo $PASSWD | passwd --stdin $UNAME &> /dev/null
  if [ $? -eq 0 ]
  then 
	echo "$UNAME,create success"
  else
	echo "$UNAME,create failure"
  fi
fi
done

# 运行脚本
[root@alliyun jiaobenDemo]# bash createacount.sh 
enter the users password:101650
andy,create success
barry,create success
jack,create success
simmen,create success
tracy,create success

while

编写一个猜数字大小的脚本

[root@alliyun jiaobenDemo]# vim  guess.sh
#! /bin/bash
# guess which the integer is
INTEGER=$(expr $RANDOM % 1000)
TIMES=0
echo "there is a integer between 0 and 999,guess who it is"
echo $INTEGER
while true
do 
read -p "please guess:" INT
let TIMES++
if [ $INT -eq  $INTEGER ]
then
echo "congratulations,your answar is right,the true integer is $INTEGER"
echo "you guessed $TIMES times"
exit 0
elif [ $INT -gt $INTEGER ]
then 
echo "too big"
else
echo "too small"
fi
done

[root@alliyun jiaobenDemo]# bash guess.sh 
there is a integer between 0 and 999,guess who it is
619
please guess:500
too small
please guess:600
too small
please guess:700
too big
please guess:800
too big
please guess:120
too small
please guess:80
too small
please guess:66
too small
please guess:619
congratulations,your answar is right,the true integer is 619
you guessed 9 times
[root@alliyun jiaobenDemo]# 

case

#! /bin/bash

read -p "please anter a string:" KEY
case "$KEY" in
[a-z] | [A-Z])
echo "what your input is alphabeta"
;;
[0-9])
echo "what you input is number"
;;
*)
echo "what you input is space or other control string"
esac

[root@alliyun jiaobenDemo]# bash checkkey.sh 
please anter a string:1
what you input is number
[root@alliyun jiaobenDemo]# bash checkkey.sh 
please anter a string:t
what your input is alphabeta
[root@alliyun jiaobenDemo]# bash checkkey.sh 
please anter a string:
what you input is space or other control string

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sheel脚本 的相关文章

  • linux下X上的系统范围键盘钩子

    在 Linux X windows 上安装键盘挂钩以便在按下某些组合键时触发某些应用程序的最佳方法是什么 无论哪个窗口管理器正在运行 有没有办法做到这一点 这个想法是当按下某个键时调用一个应用程序 或带到前台 就像 Google 桌面上的
  • 如何使用管道字符分隔符分隔字段

    我知道这个问题已经被问过 但我发现没有一个解决方案对我有用 我有一个程序 其输出如下 COUNT 293 1 lps 我对第二个字段感兴趣 但是这些尝试都没有成功 spawn 1 cut d f2 spawn 1 cut d f2 spaw
  • 为 Python 终端提供持久的历史记录

    有没有办法告诉交互式 Python shell 保留会话之间执行命令的历史记录 当会话运行时 在执行命令后 我可以向上箭头并访问所述命令 我只是想知道是否有某种方法可以保存一定数量的这些命令 直到下次使用 Python shell 时 这将
  • 从 S3 存储桶下载 300 万个对象的最快方法

    我尝试过使用 Python boto 多处理 S3cmd 和 J3tset 但都在努力解决 有什么建议 也许是您一直在使用的现成脚本或我不知道的其他方式 EDIT eventlet boto 是一个有价值的解决方案 如下所述 在这里找到了一
  • Vim 错误格式和 jslint

    我正在尝试让 makeprg 和 errorformat 与 VIM 和 jslint 一起使用 但似乎无法为我的生活提供正确的错误格式 我正在使用 jslint 的 NodeJS 版本 它会产生如下结果 1 116 9 The body
  • 如何在 Linux 中创建可通过 Screen 应用程序连接的 pty

    我想创建 C C 应用程序 它在 dev xxx 中创建新的 虚拟 设备 并且能够与 屏幕 应用程序连接 例如 循环运行的程序会创建新的 dev ttyABC 然后我将使用 屏幕 dev ttyABC 当我向那里发送一些字符时 应用程序将其
  • 如何对“s3cmd ls”的输出进行排序

    Amazon s3cmd ls 的输出如下 2010 02 20 21 01 1458414588 s3 file1 tgz 00 br 2010 02 20 21 10 1458414527 s3 file1 tgz 01 br 2010
  • 如何通过jiffies实现经过时间

    我想了解如何在 C 中使用 jiffies 实现经过时间 假设我有一系列指令 include
  • Linux:如何调试 SIGSEGV?如何追踪错误源?

    我的火狐浏览器从今天开始崩溃了 我没有更改系统或 Firefox 配置上的任何内容 I use strace ff o dumpfile txt firefox来追踪问题 这没什么大帮助 我在两个生成的进程转储中看到了段错误 但我怎样才能t
  • 在Unix下,判断执行该程序的用户是否是root?

    我正在编写一个 rake 脚本 并希望检测 如果可能的话 使用 Ruby 而不是 bash 执行 rake 脚本的用户是否具有 root 权限 如果它不是 root 那么我想终止脚本 Use uid http www ruby doc or
  • Linux中根据USB VID:PID获取设备路径

    如果我插入一个设备 比如说 dev ttyUSB0我想知道号码0基于其 VID PID 通过lsusb 我怎样才能在 C Linux 中做到这一点 我有这个代码来查找一台打印机设备 如果有帮助的话 int printer open void
  • 我可以使用 GIT_CONFIG 环境变量来为所有 git 命令使用配置文件吗

    我一直在尝试使用 git 配置文件export GIT CONFIG
  • 在 Linux 内核中使用断言

    我有一个问题assert 在Linux中 我可以在内核中使用它吗 如果不是 例如 如果我不想输入 NULL 指针 您通常会使用什么技术 对应的内核宏是BUG ON and WARN ON 前者适用于当您想让内核恐慌并使系统崩溃 即不可恢复的
  • 如何在 Vim 中创建带有控件和功能键的映射?

    我想要一个映射来快速退出所有缓冲区 以便在我对大量文件进行 vimdiff 时使用 事实证明 Control 和功能键在一起具有很好的安全性 这样我就不会不小心按下这个组合 无意中离开 Vim 我尝试了以下映射 map
  • rusage 进程/线程的 Cpu 时间不可能

    我正在计算进程 线程正在使用的 cpu 时间之间的增量 以及某个函数的调用之间的增量 我得到了进程 cpu 时间不可能的值 有时下一次调用会返回较小的 cpu 时间 这是不可能的 这是我用来计算CPU时间的代码 u64 CpuTime ca
  • __NR_gettid 和 SYS_gettid 之间的区别

    我只是在寻找在 Linux 中获取唯一线程 ID 的方法 我发现的方法是将两个参数中的任何一个作为参数进行系统调用 NR gettid OR SYS gettid 有人能解释一下它们之间有何不同吗 Nothing in
  • 无法通过 SSH 连接到 Google 计算引擎

    我在一个新项目中设置了一个新的 Google Compute Engine 实例 我启动实例并使用命令gcloud init连接到我的项目 然后我使用命令sudo gcloud compute ssh instance 1 它引导我完成 S
  • SDL - 窗口不显示任何内容

    我正在执行 SDL C 的第一步 并从 www sdl org 上学习了一些教程 但有一个问题 我已经在我的 Linux Mint 系统上安装了 SDL2 编译了教程代码 ifdef cplusplus include
  • 在 Vim 的 `autocmd` 命令中调用函数

    我想使用expand函数在一个autocmd 特别是 我正在改编tip https stackoverflow com questions 1240037 recommended build system for latex 1394702
  • 使用 tac 和 sed 反转文件

    我有一个用例 我需要搜索并替换文件中最后一次出现的字符串并将更改写回文件 下面的案例是该用例的简化版本 我正在尝试反转该文件 进行一些更改 再次将其反转并写入该文件 我为此尝试了以下代码片段 tac test sed s a b sed i

随机推荐

  • 【大数据采集技术与应用】【第一章】【大数据采集技术与应用概述】

    文章目录 1 1 大数据概述 1 1 1 大数据时代 1 1 2 大数据的概念 1 1 3 大数据的特征 1 1 4 大数据的应用 1 1 5 大数据关键技术 1 1 6 大数据处理流程 1 2 大数据采集技术概述 1 2 1 数据采集与大
  • Solidity API

    这是Solidity教程系列文章第8篇介绍Solidity API 它们主要表现为内置的特殊的变量及函数 存在于全局命名空间里 Solidity 系列完整的文章列表请查看分类 Solidity 写在前面 Solidity 是以太坊智能合约编
  • java 基础编程练习1

    题目描述 KiKi有一个矩阵 他想知道经过k次行变换或列变换后得到的矩阵 请编程帮他解答 输入描述 第一行包含两个整数n和m 表示一个矩阵包含n行m列 用空格分隔 1 n 10 1 m 10 从2到n 1行 每行输入m个整数 范围 231
  • PyTorch 图像:06.使用ONNX将模型转移至Caffe2和移动端

    使用ONNX将模型转移至Caffe2和移动端 在本教程中 我们将介绍如何使用 ONNX 将 PyTorch 中定义的模型转换为 ONNX 格式 然后将其加载到 Caffe2 中 一旦进入 Caffe2 我们就可以运行模型来仔细检查它是否正确
  • Intellij idea配置与使用教程

    俗话说 工欲善其事必先利其器 现在基本上做Java开发的工具都是用intellij idea 开发工具了 我观看了几个博客 其实写的都差不多 配置也都一样 故在此我就不累赘 直接附上几个链接仅供参考 解决IntelliJ IDEA启动缓慢的
  • 小程序如何引入第三方依赖或样式库

    使用第三方依赖 wx axios promise 如果直接引入模块同时还使用useExtendedLib引入了依赖 那么就会冲突 此时就需要构建npm了 import axios from wx axios promise const Ax
  • 公共异常处理方法

    通过建立公共异常处理类 就不需要在每一个controller中都使用try catch了 先定义执行成功或者出现异常返回的实体类 public class ResultOk implements Serializable private I
  • 数据库表字段命名规范

    数据库表字段命名规范 摘要 当前研发工作中经常出现因数据库表 数据库表字段格式不规则而影响开发进度的问题 在后续开发使用原来数据库表时 也会因为数据库表的可读性不够高 表字段规则不统一 造成数据查询 数据使用效率低的问题 所以有必要整理出一
  • python是一门面向对象的高级_【开发教程】Python高级课程之面向对象开发视频教程...

    Python从设计之初就已经是一门面向对象的语言 正因为如此 在Python中创建一个类和对象是很容易的 本章节我们将详细介绍Python的面向对象编程 如果你以前没有接触过面向对象的编程语言 那你可能需要先了解一些面向对象语言的一些基本特
  • 独孤九剑第三式-决策树和随机森林

    文章适合于所有的相关人士进行学习 各位看官看完了之后不要立刻转身呀 期待三连关注小小博主加收藏 小小博主回关快 会给你意想不到的惊喜呀 文章目录 前言 决策树理论讲解 问题引出 问题解决 信息熵 条件熵 信息增益 信息增益率 基尼指数 条件
  • ubuntu下Vim安装失败,报The following packages have unmet dependencies: vim : Depends: vim-common

    The following packages have unmet dependencies vim root ubuntu etc apt apt install vim Reading package lists Done Buildi
  • vscode

    01 vscode介绍使用 一 介绍 1 VScode是微软推出的一款轻量级的编辑器 采用了和VS相同的UI界面 2 界面介绍 左侧是用于展示所要编辑的所有文件和文件夹的文件管理器 依次是资源管理器 搜索 GIT 调试 插件 右侧是打开文件
  • LDA(Latent Dirichlet Allocation)主题模型算法

    LDA Latent Dirichlet Allocation 主题模型算法 LDA整体流程 先定义一些字母的含义 文档集合D topic集合T D中每个文档d看作一个单词序列 lt w1 w2 wn gt wi表示第i个单词 设d有n个单
  • const(一):(转) 一个函数名后面加const表示什么意思

    http zjw86212 blog 163 com blog static 116692085200910394324880 const用在成员函数后 主要是针对类的const对象 如 class Text public void pri
  • 嵌入式Linux开发环境搭建-2-制作编译工具

    嵌入式Linux开发环境搭建 2 制作编译工具 一 安装基本开发环境 1 1 build essential安装 1 2 bison和flex 4 3 安装C函数库的man手册 二 安装交叉编译工具链 2 1 相关软件下载 2 2 修改一个
  • 使用wxWidgets的wxGenericAboutDialog类

    使用wxWidgets的wxGenericAboutDialog类 wxWidgets是一个开源的C 图形用户界面库 用于跨平台的应用程序开发 它提供了丰富的GUI控件和工具 使开发者能够轻松地创建具有不同操作系统外观的应用程序 其中 wx
  • 利用GeoHash实现逆地理编码(经纬度坐标转换行政区划)

    目录 前言 理解GeoHash GeoHash精度 GeoHash特征 GeoHash规律 逆地理编码 实现逆地理编码的基本思路 1 全国范围内6位精度GeoHash计算 2 获取全国范围内区 县 三级市级别行政区划地址围栏点 3 计算6位
  • 监督学习和无监督学习

    文章目录 监督学习和无监督学习 监督学习算法包括 无监督学习算法包括 OpenCV十个子类 举例 监督学习和无监督学习 监督学习和无监督学习是机器学习领域中两种不同的学习范式 它们之间的区别在于数据的标签或标记的可用性以及学习任务的性质 监
  • Python_Logging日志模块(一)

    一 日志的作用 展现当前程序的活动情况 记录程序的运行轨迹 规范稳定的日志可以帮助开发者迅速定位程序的问题 二 日志的内容 正常情况下 一条完整的日志应该包含调用日志的时间戳 数字形式的日志级别 调用日志的实例化函数的路径 线程名 抛出的活
  • sheel脚本

    sheel脚本 sheel脚本 sheel脚本 sheel脚本的工作方式有两种 交互式和批处理 交互式 用户输入一条就立即执行 批处理 由用户实现编写好一个完整的sheel脚本 sheel会一次执行脚本中诸多命令 脚本中不仅会用到一般的li