Linux中编写Shell脚本_linux编写sh脚本_致守的博客-程序员秘密

技术标签: Linux  

目录

Shell

Shell脚本的执行

Shell脚本编写规范

Shell 中的变量

变量的算术运算

双小括号 (())  数值运算命令的用法

let 运算命令的用法

expr 命令的用法

br 命令的用法

$[] 符号的运算示例

Shell脚本的条件测试

几种条件测试语句

文件测试操作符

字符串测试操作符

整数二元比较操作符

逻辑操作符

测试表达式 test 、[] 、[[]] 、 (()) 的区别

if 条件判断语句

case 条件判断语句

for循环语句

while循环语句

Break、Continue、exit 循环控制语句

Shell脚本执行scrapy爬虫和python脚本

Shell
Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序等。 用户每输入一条命令,Shell就执行一条。这种从键盘输入命令,就可以立即得到回应的对话方式,称为交互的方式。

当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行时,该程序文件就被称为Shell脚本。 在Shell脚本里内置了很多命令、语句及循环控制,然后将这些命令一次性执行完毕,这种通过文件执行脚本的方式称为非交互的方式。 Shell脚本语言很适合用于处理纯文本型的数据,而Linux系统中几乎所有的配置文件、日志文件,以及绝大对数的启动文件都是纯文本类型的文件。
Shell 脚本的类型
Shell脚本语言是弱类型语言(无须定义变量的类型即可使用),在Unix/Linux中主要有两大类shell: 
一类是 Bourne  shell ,另一类是 C shell

Bourne shell 包括 Bourne shell (sh)、Korn shell(ksh)、Bourne Again Shell 三种类型。 
C shell包括csh、tcsh两种类型
查看系统默认的shell: echo  $SHELL
查看系统支持的shell: cat  /etc/shells

 

Shell脚本的执行
Shell脚本的执行通常可以采用以下几种方式。

1、bash script-name 或 sh script-name     这是当脚本文件本身没有执行权限时常使用的方法

2、path/script-name 或./script-name    在当前路径下执行脚本,需要将脚本文件的权限改为可执行。然后使用脚本的绝对路径或相对路径就可以直接执行脚本了。

3、source script-name 或 .  script-name 这种方法通常是使用source或 “.”(点号)读入或加载指定的Shell脚本文件,然后依次执行指定的Shell脚本中的语句。这些语句将在当前父 shell 脚本进程中执行(其他几种模式都会启用新的进程执行该脚本进程)。

Shell脚本编写规范
Shell脚本的开发规范及习惯非常重要,虽然这些规范不是必须要遵守的,但有了好的规范和习惯,可以大大提升开发效率,并能在后期降低对脚本的维护成本。

1、一个规范的Shell脚本在第一行会指出由哪个程序(解释器)来执行脚本中的内容,这一行内容在Linux bash的编程一般为:#!/bin/bash  或 #!  /bin/sh     bash 与 sh 的区别 , sh 为 bash的软连接,大多数情况下,脚本使用“#!/bin/bash”和“#!/bin/sh”是没有区别的,但更规范的写法是在脚本的开头使用    #!/bin/bash 

2、在shell脚本中,跟在 # 后面的内容表示注释,用来对脚本进行注释说明,注释部分不会被当做程序来执行,仅仅是给开发者和使用者看的,系统解释器是看不到的,更不会执行。注释可以自成一行,也可以跟在脚本命令的后面与命令在同一行。 注释尽量不要使用中文,在脚本中最好也不要有中文。

3、Shell脚本的开头会加版本、版权等信息

# Date:16:29 2018-10-20 
# Author: Create by xiaoxie
# Description: This script function is …… 
# Version: 1.1 

4、在shell脚本中尽量不用中文注释,尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰。

5、Shell脚本的命名应以.sh为扩展名 例如:1.sh

6、成对的符号应尽量一次性写出来,然后退格在符号内增加内容,以防止遗漏。这些成对的符号包括: {}、[]、‘’、“”  等

7、中括号[]两端至少要有1个空格,因此,键入中括号时即留出空格[  ],然后在退格键入中间内容,并确保两端都至少由一个空格。

8、对于流程控制语句,应一次性将格式写完,再添加内容。 如:一次性完成for循环语句的格式

for
do
     内容
done

9、通过缩进让代码更易读,如:

if 条件内容     
       then         
            内容 
fi 
10、对于常规变量的字符串定义变量值应加双引号,并且等号前后不能有空格,需要强引用的,则用单引号(‘’),如果是命令的引用,则用反引号(``)。

 

11、脚本中的单引号、双引号及反引号必须为英文状态下的符号。

Shell 中的变量
简单地说,变量就是用一个固定的字符串(也可能是字符、数字等的组合)代替更多、更复杂的内容,该内容里可能还会包含变量、路径、字符串等其他内容。 变量是暂时存储数据的地方及数据标记,所存储的数据存在于内存空间中,通过正确地调用内存中变量的名字就可以读取出与变量对应的数据。

变量的赋值方法为: 先写变量名称,紧接着是 "=" ,最后是值。中间无任何空格。 通过echo命令加上  $变量名,即可输出变量的值。 双引号,以防止出错变量的值一般要加上。

定义变量时变量名建议用大写,如  A=xie     B=99

read  -p  “提示信息”   变量名      #交互式赋值方法

查看变量内容 echo $A  或  echo ${A}

 

赋值时使用引号的作用

  • 双引号:允许通过$符号引用其他变量值
  • 单引号:禁止引用其他变量值,$视为普通字符
  • 反撇号:命令替换,提取命令执行后的输出结果 全局变量的定义方法 export 变量名

 

位置参数

位置参数是一种在调用 Shell 程序的命令行中按照各自的位置决定的变量,是在程序名之后输入的参数。 位置参数之间用空格分隔,Shell取第一个位置参数替换程序文件中的 $1,第二个替换 $2 , 依次类推。$0 是一个特殊变量,它的内容是当前这个shell程序的文件名,所以 $0 不是一个位置参数。

假如我现在有一个 1.sh脚本文件,内容如下

#! /bin/bash
echo $1
echo $(($2+$3))

当我执行时,我在文件名后加3个参数

 

预定义变量

预定义变量和环境变量相类似,也是在Shell一开始就定义的变量,不同的是,用户只能根据shell的定义来使用这些变量,所有预定义变量都是由符号“$”和另一个符号组成。 常见的Shell预定义变量有以下几种。

$# :位置参数的数量
$* :所有位置参数的内容
$? :命令执行后返回的状态,0表示没有错误,非0表示有错误
$$ :当前进程的进程号
$! :后台运行的最后一个进程号
$0 :当前执行的进程名
假如我现在有一个 1.sh脚本文件,内容如下

#! /bin/bash
 
echo $1
echo ${2}+${3}
 
echo $#             #打印出位置参数的数量
echo $*             #打印出位置参数的内容
echo $?             #打印出命令执行后返回的状态
echo $$             #打印出当前进程的进程号
echo $0             #打印出当前进程的进程名

当我执行时,我在文件名后加3个参数

 参考文章:Linux中环境变量的设置

变量的算术运算

Shell中常见的算术运算符

Shell 中常见的算术运算命令 

 双小括号 (())  数值运算命令的用法

双小括号 (()) 的作用是进行数值运算与数值比较,它的效率很高,用法灵活,是Linux下常用的运算操作符。其操作方法如下:

 

 

let 运算命令的用法

let运算命令的语法格式为: let 赋值表达式  

let 赋值表达式的功能等同于“((赋值表达式))” 范例:  给变量 i 加8

expr 命令的用法

1、expr 用于运算 
   语法:expr 表达式 
   范例:expr 2 + 2 ; expr 2 – 2 ; expr 2  \*  2 ;  expr 2  /  2    
   注意:运算符号和数字之间要有空格!!

 

 

2、expr配合变量计算

expr在Shell中可配合变量进行计算,但需要用反引号将计算表达式括起来。

 3、利用 expr 计算字符串的长度

 

br 命令的用法

bc 是UNIX/Linux下的计算器,除了作为计算器来使用,还可以作为命令行计算工具使用

交互模式 在shell命令行直接输入 bc 及能进入bc语言的交互模式

 

bc也可以进行非交互式的运算,方法是与 echo 一起使用,所以我们就可以写在脚本里面

$[] 符号的运算示例 

 

Shell脚本的条件测试

通常,在shell的各种条件结构和流程控制结构中都要进行各种测试,然后根据测试结果执行不同的操作,有时候也会与 if 等条件语句相结合,来完成测试判断,以减少程序运行错误。

几种条件测试语句

 文件测试操作符

注:(())不能用于文件测试,文件测试一般常用的是 []

 字符串测试操作符

注: == 和 !=  两端要有空格  ,(())不能用于字符测试

 整数二元比较操作符

"="和"!="也可以在[]中作比较使用,但在[]中使用包含"<"和">"的符号时,需要用反斜线转义,有时不转义虽然语法不会报错,但是结果可能不对。
也可以在[[]]中使用包含“-gt”和“-lt”的符号,但是不建议使用
比较符号两端也要有空格,[] (())  [[]]  两端都要有空格

 逻辑操作符

 

测试表达式 test 、[] 、[[]] 、 (()) 的区别

if 条件判断语句

#####单条件判断##############
if  条件判断
  then 
      命令
else
      命令
fi
 
#或
 
if  条件判断;then 
     命令
else
     命令
fi

 

 

###双条件判断#####
if 条件判断
  then
      命令
elif 条件判断
  then 
      命令
else
   命令
fi
 
##或
if 条件判断;then
    命令
elif 条件判断;then 
    命令
else
    命令
fi

 

if语句对于字符串的匹配 

 

case 条件判断语句

case条件语句相当于多分支的if/elif/ellse条件语句,但是它比这些条件语句看起来更规范更工整,常被应用于实现系统服务启动脚本等企业应用场景中。

case  变量  in
        one)
            命令
;;
        two)
             命令
;;
         *) 
             命令
esac

 

 for循环语句

for  条件
do
   命令
done
 
##或
 
for  条件;do
   命令
done

 

 

while循环语句

while  条件
do
   命令
done

Break、Continue、exit 循环控制语句

break 、continue在条件语句及循环语句(for、while、if等)中用于控制程序走向;而exit则用于终止所有语句并退出当前脚本。

 

 

 

Shell脚本执行scrapy爬虫和python脚本

#! /bin/bash
cd /opt/project/
scrapy crawl xx
python3 test.py

(36条消息) Linux中编写Shell脚本_谢公子的博客-程序员秘密_linux shell脚本编写

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/tjcwt2011/article/details/119004821

智能推荐

【安全牛学习笔记】离线密码破解_weixin_34360651的博客-程序员秘密

离线密码破解-----oclhashcat 号称世界上最快、唯一的基于GPGPU的密码破解软件 免费开源、支持多平台、支持分布式、150+hash算法硬件支持 - 虚拟机中无法使用 - 支持CUDA技术的N...

babel7.0 兼容ie浏览器_王海虎的博客-程序员秘密

替代 @babel/polyfill// 入口文件出引入import "core-js/stable";import "regenerator-runtime/runtime";// .babelrc 下添加[ "@babel/env", { "corejs": "3", "useBuiltIns": "entry", "targets": { "chrome": "58", "i

Linux编程 15 文件权限(用户管理 useradd,userdel,usermod,passwd,chpasswd,chsh, chfn,chage)_weixin_34128501的博客-程序员秘密

一. 概述  在上一篇中讲到了与用户账户有关的二个文件passwd和shadow,以及useradd工具的介绍。这篇接着讲useradd+参数,删除用户,修改用户的演示。  1. 删除用户userdel    使用userdel可以删除用户,但只会删除etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件。如果加上-r 参数,userdel会删除用户HOME目录以...

一次程序出现CPU占用过高的处理过程_开一个软件cpu就满了_友善啊,朋友的博客-程序员秘密

今天处理一个程序打开CPU就占用超过20%(6核的i5-9400)的问题。 排查后将问题锁定在程序切换主题的代码上,程序打开后会发出一个事件,设置主题。 设置主题时候大量调用了setStyleSheet设置窗口样式,一开始我以为是大量调用了setStyleSheet导致CPU占用过高,搜索发现很多人也说频繁调用setStyleSheet会导致CPU占用过高降不下来,后来发现不是这样,导致cpu占用过高的是这段代码: QColor c = QCo...

程序员杂记:找工作的经历_剑了的博客-程序员秘密

后来,我就业了,从一个“光荣”的“自由职业”,变成一个“可悲”的上班族!不记得是2003年的那个月份,在同宿舍的大哥“老樊”的“诱导”下,与他一起去了人才市场。正好碰上了专场招聘会,你知道在太原这小地方,如果不是IT公司专场招聘会的话,很少有软件公司去招人的,因为这地方的软件公司

html弹性盒子布局,div+css3弹性盒子(flex box)布局_灰灰大狼的博客-程序员秘密

一、CSS3 弹性盒子(Flex Box)弹性盒子是CSS3的一种新布局模式。CSS3 弹性盒( Flexible Box 或 flexbox),是一种当页面需要适应不同的屏幕大小以及设备类型时确保元素拥有恰当的行为的布局方式。引入弹性盒布局模型的目的是提供一种更加有效的方式来对一个容器中的子元素进行排列、对齐和分配空白空间。首先要明白几个概念:主轴:Flex容器的主轴主要用来配置Flex项目,默...

随便推点

shiro权限认证及授权的执行流程分析及图解(一)_shiro权限认证流程_程序猿邱先森的博客-程序员秘密

(配置文件请看下一个博客)https://blog.csdn.net/weixin_41716049/article/details/84336696为了颜色标识注释,前面没有使用代码框,多多担待《一,认证》1.先建两个class文件 一个写AuthRealm (授权与认证方法,并继承)extends AuthorizingRealm获取其默认方法doGetAu...

php 请求并获取文件流,PHP 获取网络接口文件流_不学无术嘤嘤怪的博客-程序员秘密

获取网络接口里面的文件流php开发调用各种接口在所难免,有时需要传递很多参数。在传递参数过程中 '&amp;' 有时会被 解析成 ‘&amp;’导致请求失败经过查找资料和比较,发现php提供了多种方法:cUrl、fopen、file_get_contents等,就操作性、可靠性和高效来说 cURL还是不错的。参考案例如下:/*** 获取网络接口里面的文件流**/public function Ge...

来客推开源电商系统部署环境_来客推小程序商城开源版 服务器部署教程_icomk的博客-程序员秘密

官方开发环境:PHP5.6~7.3和Mysql5.5+推荐一:宝塔 ( 下载地址 http://www.bt.cn )推荐二:phpstudy (下载地址 http://phpstudy.php.cn )注意:如果是Linux环境下请选择 “宝塔”来客推开源版电商小程序,可去Logo前后端全部开源,可支持 [ 微信 + 支付宝 + 百度 + 头条 ] 小程序 + APP + 公众号 + PC + H5。PHP5.6+、 MYSQL5.5+、Uniapp、原生小程序、原生IOS、原生Android

iOS 中的多线程知识点_林升起的博客-程序员秘密

一、概念1.1 进程进程是程序在一个数据集合上运行的过程(注:一个程序有可能同时属于多个进程),它是CPU进行资源分配和调度的一个独立单位。1.2 线程线程,也被称为轻量进程(lightweight processes),指运行中的程序的调度单位。每1个进程至少要有1条线程。也可以认为线程是进程中的1条执行路径。线程和进程比较: 进程是CPU分配资源和调度的单位。...

微信小程序修改radio图标大小_沉、睡的博客-程序员秘密

微信小程序修改radio图标大小代码如下radio{ transform:scale(0.7);}

推荐文章

热门文章

相关标签