shell脚本 订阅
Shell Script [1]  ,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。 展开全文
Shell Script [1]  ,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。
信息
外文名
Shell
领    域
计算机
中文名
Shell脚本
性    质
名词
Shell脚本基本介绍
换一种说法也就是,shell script是利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与指令写在里面,然后用正规表示法,管道命令以及数据流重导向等功能,以达到我们所想要的处理目的。更明白地来说,shell script就像早期dos年代的.bat,最简单的功能就是将许多指令汇整写一起,让使用者很容易地就能够一个操作执行多个命令,而shell script更是提供了数组,循环,条件以及逻辑判断等重要功能,让使用者可以直接以shell来写程序,而不必使用类似C程序语言等传统程序编写的语法。
收起全文
精华内容
参与话题
问答
  • shell脚本--sed的用法

    万次阅读 多人点赞 2018-05-17 01:04:27
    sed在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳...本文主要介绍sed的一些基本用法,并通过shell脚本演示sed的使用实例。 1.sed的使用方法,调用sed 命令的语法有两种: 一.在命令...

    sed在处理文本时是逐行读取文件内容,读到匹配的行就根据指令做操作,不匹配就跳过

    sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑。本文主要介绍sed的一些基本用法,并通过shell脚本演示sed的使用实例。

    1.sed的使用方法,调用sed 命令的语法有两种:

    一.在命令行指定sed指令对文本进行处理:sed +选项  ‘指令’ 文件

    二.先将sed指令保存到文件中,将该文件作为参数进行调用:sed   +选项  -f  包含sed指令的文件  文件

    sed的常用选项:

    -r:使用扩展正则表达式

    -e:它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项

    -f:后跟保存了sed指令的文件

    -i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改

    -n:取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行

    sed中的编辑命令:

    a:追加  向匹配行后面插入内容

    c:更改  更改匹配行的内容

    i:插入  向匹配行前插入内容

    d:删除  删除匹配的内容

    s:替换  替换掉匹配的内容

    p:打印  打印出匹配的内容,通常与-n选项和用

    =:用来打印被匹配的行的行号

    n:读取下一行,遇到n时会自动跳入下一行

    r,w:读和写编辑命令,r用于将内容读入文件,w用于将匹配内容写入到文件

    2.sed命令实例:

    示例1:向文件中添加或插入行

    sed '3ahello' 1.txt   #向第三行后面添加hello,3表示行号

    sed '/123/ahello' 1.txt #向内容123后面添加hello,如果文件中有多行包括123,则每一行后面都会添加

    sed  '$ahello'  1.txt  #在最后一行添加hello

    sed '3ihello'  1.txt    #在第三行之前插入hello

    sed '/123/ihello'  1.txt   #在包含123的行之前插入hello,如果有多行包含123,则包含123的每一行之前都会插入hello

    sed '$ihello'  1.txt     #在最后一行之前插入hello

    示例2:更改文件中指定的行

    sed  '1chello'  1.txt  #将文件1.txt的第一行替换为hello

    sed  '/123/chello'  1.txt  #将包含123的行替换为hello

    sed '$chello'  1.txt  #将最后一行替换为hello

    示例3:删除文件中的行

    sed  '4d'  1.txt    #删除第四行

    sed '1~2d' 1.txt   #从第一行开始删除,每隔2行就删掉一行,即删除奇数行

    sed   '1,2d'  1.txt   #删除1~2行

    sed  '1,2!d'  1.txt   #删除1~2之外的所有行

    sed  '$d'   1.txt      #删除最后一行

    sed  '/123/d'   1.txt   #删除匹配123的行

    sed  '/123/,$d'  1.txt  #删除从匹配123的行到最后一行

    sed  '/123/,+1d'  1.txt   #删除匹配123的行及其后面一行

    sed  '/^$/d'    1.txt    #删除空行

    sed   '/123\|abc/!d'  1.txt    #删除不匹配123或abc的行,/123\|abc/ 表示匹配123或abc ,!表示取反

    sed  '1,3{/123/d}'   1.txt     #删除1~3行中,匹配内容123的行,1,3表示匹配1~3行,{/123/d}表示删除匹配123的行

    示例4:替换文件中的内容

    sed  's/123/hello/'   1.txt   #将文件中的123替换为hello,默认只替换每行第一个123

    sed  's/123/hello/g'  1.txt #将文本中所有的123都替换为hello

    sed 's/123/hello/2'   1.txt  #将每行中第二个匹配的123替换为hello

    sed  -n 's/123/hello/gpw  2.txt'   1.txt    #将每行中所有匹配的123替换为hello,并将替换后的内容写入2.txt

    sed  '/#/s/,.*//g'  1.txt   #匹配有#号的行,替换匹配行中逗号后的所有内容为空  (,.*)表示逗号后的所又内容

    sed  's/..$//g'  1.txt  #替换每行中的最后两个字符为空,每个点代表一个字符,$表示匹配末尾  (..$)表示匹配最后两个字符

    sed 's/^#.*//'  1.txt      #将1.txt文件中以#开头的行替换为空行,即注释的行  ( ^#)表示匹配以#开头,(.*)代表所有内容

    sed 's/^#.*//;/^$/d'  1.txt  #先替换1.txt文件中所有注释的空行为空行,然后删除空行,替换和删除操作中间用分号隔开

    sed 's/^[0-9]/(&)/'   1.txt   #将每一行中行首的数字加上一个小括号   (^[0-9])表示行首是数字,&符号代表匹配的内容

    或者  sed 's/\(^[0-9]\)/(\1)/'   1.txt  #替换左侧特殊字符需钥转义,右侧不需要转义,\1代表匹配的内容

    sed  's/$/&'haha'/'  1.txt   # 在1.txt文件的每一行后面加上"haha"字段

    示例5:打印文件中的行

    sed  -n '3p'  1.txt   #打印文件中的第三行内容

    sed  -n '2~2p'  1.txt   #从第二行开始,每隔两行打印一行,波浪号后面的2表示步长

    sed -n '$p'  1.txt  #打印文件的最后一行

    sed -n '1,3p'  1.txt  #打印1到3行

    sed  -n '3,$p'  1.txt  #打印从第3行到最后一行的内容

    sed  -n '/you/p'  1.txt   #逐行读取文件,打印匹配you的行

    sed  -n '/bob/,3p'  1.txt  #逐行读取文件,打印从匹配bob的行到第3行的内容

    sed  -n  '/you/,3p'  1.txt  #打印匹配you 的行到第3行,也打印后面所有匹配you 的行

    sed  -n '1,/too/p'  1.txt    #打印第一行到匹配too的行

    sed  -n  '3,/you/p'  1.txt   #只打印第三行到匹配you的行

    sed  -n '/too/,$p'  1.txt  #打印从匹配too的行到最后一行的内容

    sed  -n '/too/,+1p'  1.txt    #打印匹配too的行及其向后一行,如果有多行匹配too,则匹配的每一行都会向后多打印一行

    sed  -n '/bob/,/too/p'  1.txt   #打印从匹配内容bob到匹配内容too的行

    示例6:打印文件的行号

    sed  -n "$="   1.txt   #打印1.txt文件最后一行的行号(即文件有多少行,和wc -l 功能类似)

    sed  -n '/error/='  1.txt     #打印匹配error的行的行号

    sed  -n '/error/{=;p}'   1.txt    #打印匹配error的行的行号和内容(可用于查看日志中有error的行及其内容)

    示例7:从文件中读取内容

    sed  'r 2.txt'  1.txt  #将文件2.txt中的内容,读入1.txt中,会在1.txt中的每一行后都读入2.txt的内容

    sed '3r 2.txt'  1.txt       #在1.txt的第3行之后插入文件2.txt的内容(可用于向文件中插入内容)

    sed  '/245/r   2.txt'   1.txt    #在匹配245的行之后插入文件2.txt的内容,如果1.txt中有多行匹配456则在每一行之后都会插入

    sed  '$r  2.txt'   1.txt     #在1.txt的最后一行插入2.txt的内容

    示例8:向文件中写入内容

    sed  -n  'w 2.txt'   1.txt   #将1.txt文件的内容写入2.txt文件,如果2.txt文件不存在则创建,如果2.txt存在则覆盖之前的内容

    sed   -n '2w  2.txt'   1.txt   #将文件1.txt中的第2行内容写入到文件2.txt

    sed  -n -e '1w  2.txt'  -e '$w 2.txt'   1.txt   #将1.txt的第1行和最后一行内容写入2.txt

    sed  -n -e '1w  2.txt'  -e '$w  3.txt'  1.txt   #将1.txt的第1行和最后一行分别写入2.txt和3.txt

    sed  -n  '/abc\|123/w  2.txt'    1.txt   #将1.txt中匹配abc或123的行的内容,写入到2.txt中

    sed  -n '/666/,$w 2.txt'   1.txt   #将1.txt中从匹配666的行到最后一行的内容,写入到2.txt中

    sed  -n  '/xyz/,+2w  2.txt'     1.txt     #将1.txt中从匹配xyz的行及其后2行的内容,写入到2.txt中

    示例9:sed 在shell脚本中的使用

    实例1:替换文件中的内容

    #!/bin/bash
    if [ $# -ne 3 ];then            #判断参数个数
      echo "Usage:  $0 old-part new-part filename"    #输出脚本用法
      exit
    fi

    sed -i "s#$1#$2#"  $3          #将 旧内容进行替换,当$1和$2中包含"/"时,替换指令中的定界符需要更换为其他符号

    实例2:删除文件中的空白行

    #!/bin/bash

    if [ ! -f $1 ];then         #判断参数是否为文件且存在

       echo "$0 is not a file"

       exit

    fi

    sed -i "/^$/d"   $1 #将空白行删除

    实例3:格式化文本内容

    #!/bin/bash
    a='s/^  *>//      #定义一个变量a保存sed指令,'s/^ *>//':表示匹配以0个或多空格开头紧跟一个'>'号的行,将匹配内容替换
    s/\t*//                 #'s/\t*//':表示匹配以0个或多个制表符开头的行,将匹配内容替换

    s/^>//               #'s/^>//' :表示匹配以'>'开头的行,将匹配内容替换

    s/^ *//'               #'s/^ *//':表示匹配以0个或多个空格开头的行,将匹配内容替换
    #echo $a
    sed "$a" $1        #对用户给定的文本文件进行格式化处理

    实用脚本:批量更改当前目录中的文件后缀名:

    示例1:

    #!/bin/bash
    if [ $# -ne 2 ];then               #判断用户的输入,如果参数个数不为2则打印脚本用法
      echo "Usage:$0 + old-file new-file"
      exit
    fi
    for i in *$1*                         #对包含用户给定参数的文件进行遍历
    do
      if [ -f $i ];then
         iname=`basename $i`        #获取文件名
         newname=`echo $iname | sed -e "s/$1/$2/g"`         #对文件名进行替换并赋值给新的变量
         mv  $iname  $newname          #对文件进行重命名
       fi
    done

    exit 666

    示例2:

    #!/bin/bash
    read -p "input the old file:" old        #提示用户输入要替换的文件后缀
    read -p "input the new file:" new
    [ -z $old ] || [ -z $new ] && echo "error" && exit      #判断用户是否有输入,如果没有输入怎打印error并退出
    for file in `ls *.$old`
    do
      if [ -f $file ];then
         newfile=${file%$old}                        #对文件进行去尾
         mv $file ${newfile}$new                   #文件重命名
      fi

    done

    示例3:

    #!/bin/bash

    if [ $# -ne 2 ];then        #判断位置变量的个数是是否为2
       echo "Usage:$0  old-file  new-file"
       exit
    fi
    for file in `ls`                      #在当前目录中遍历文件
    do
      if [[ $file =~ $1$ ]];then   #对用户给出的位置变量$1进行正则匹配,$1$表示匹配以变量$1的值为结尾的文件
         echo $file                      #将匹配项输出到屏幕进行确认
         new=${file%$1}             #对文件进行去尾处理,去掉文件后缀保留文件名,并将文件名赋给变量new                  
         mv $file ${new}$2          #将匹配文件重命名为:文件名+新的后缀名
      fi

    done

    示例4:使用sed匹配文件中的IP地址

    sed -nr  '/([0-9]{1,3}\.){3}([0-9]{1,3})/p'  1.txt

     

    展开全文
  • Shell脚本

    万次阅读 2020-10-04 20:29:52
    Shell脚本 这里写目录标题Shell脚本1.Shell脚本简介2.Shell2.1 Shell 脚本的解释器2.2 脚本的编写规范2.3 执行脚本的三种方式2.4变量的声明2.5变量的引用2.6删除变量 只读变量2.7字符串使用2.8字符串长度及截取2.9...

    Shell脚本


    1.Shell脚本简介

    Shell 是一个用 C 语言编写的程序,通过 Shell 用户可以访问操作系统内核服务。Shell 既是一种命令语言,又是一种程序设计语言。Shell script 是一种为 shell 编写的脚本程序。Shell 编程一般指 shell脚本编程,不是指开发 shell 自身。Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。Linux 的 Shell 解释器 种类众多,一个系统可以存在多个 shell,可以通过 cat /etc/shells 命令查看系统中安装的 shell解释器。Bash 由于易用和免费,在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。

    2.Shell

    2.1 Shell 脚本的解释器

    /bin/sh
    /bin/bash
    /sbin/nologin
    /bin/dash
    /bin/tcsh
    /bin/csh
    

    2.2 脚本的编写规范

    首行描述解释器 #!/bin/bash

    2.3 执行脚本的三种方式

    1、bash 脚本名称 脚本参数
    2、 sh 脚本名称 脚本参数
    3、 ./脚本名称 脚本参数【./脚本名称之间没有空格】【chmod 777 脚本名称】

    2.4变量的声明

    变量名=”值”【中间不能有空格】
    变量名要求 字母或下划线或数字(开头不能是数字)构成

    2.5变量的引用

    使用$ 或 ${}引用变量

    2.6删除变量 只读变量

    删除 unset 变量名
    只读 readonly 变量名

    2.7字符串使用

    双引号(””):内部可以使用变量
    单引号(‘’):内部所有的原样输出
    反引号(``):表示可执行

    2.8字符串长度及截取

    长度: echo ${#skill}
    截取: echo ${str:2:2} 【在第二个字符开始截取截取两位】

    2.9脚本参数传递

    bash 脚本名 参数1 参数2 参数3 。。。。。。
    脚本内
    $0 脚本名称
    $1 参数1
    $2 参数2
    $n 参数n
    $* 所有参数
    $# 参数的个数

    2.10算数运算符

    加法计算 expr 2 + 2
    乘法计算 expr 2 \* 2

    2.11流程控制if

    if [ $a -gt 10 ];then
    代码1
    elif [ $a -lt 10 ];then
    代码2
    else 代码3
    fi

    2.12关系运算符

    在这里插入图片描述

    2.13循环

    For 循环
    For aa in XXXX
    do
    循环体
    done

    While循环
    While 条件 ;
    do
    循环体
    done

    跳出循环
    跳出所有循环 break
    跳出当前循环,进入下一次循环 continue

    case ()

    case 值 in
    结果1) 结果1对应的操作;;
    结果2) 结果2对应的操作;;
    结果3) 结果3对应的操作;;
    esac

    2.14接收控制台数据

    read 变量名
    函数的使用
    函数声明:
    [function] 函数名(){
    函数体
    $参数1
    $参数2
    $参数3
    }

    函数调用 函数名 参数1 参数2 参数3

    2.15数组

    数组声明: 数组名称=(元素1 元素2 元素3 元素4)
    数组的使用
    单个使用 echo 数组名[角标] 【角标从0开始】
    遍历数组
    for var in ${my_arr[*]}
    do
    echo $var
    done

    2.16文件加载

    在文件中添加 . 脚本名称 或者 source 脚本名称
    #!/bin/bash
    source ./test1.sh # 加载test1.sh 的文件内容

    展开全文
  • Linux中编写Shell脚本

    万次阅读 多人点赞 2018-10-08 11:22:35
    Shell脚本的执行 Shell脚本编写规范 Shell 中的变量 变量的算术运算 双小括号 (()) 数值运算命令的用法 let 运算命令的用法 expr 命令的用法 br 命令的用法 $[]符号的运算示例 Shell脚本的条件测试 几种...

    目录

    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

    1. Bourne shell 包括 Bourne shell (sh)、Korn shell(ksh)、Bourne Again Shell 三种类型。 
    2. C shell包括csh、tcsh两种类型

    查看系统默认的shell: echo  $SHELL
    查看系统支持的shell: cat  /etc/shells

    Shell脚本的执行

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

    1、bash script-namesh 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 等条件语句相结合,来完成测试判断,以减少程序运行错误。

    几种条件测试语句

    文件测试操作符

    常用文件测试操作符 说明
    -d   , d的全拼为 directory 文件存在且为目录则为真
    -f   ,   f的全拼为  file 文件存在且为文件则为真
    -e , e的全拼为 exists 文件存在则为真
    -s ,s的全拼为 size 文件存在且大小不为0则为真
    -r ,r的全拼为 read 文件存在且可读则为真
    -w ,w的全拼为write 文件存在且可写则为真
    -x ,x的全拼为executable 文件存在且可执行则为真
    -L ,L的全拼为link 文件存在且为链接文件则为真
    f1 -nt  f2  ,nt的全拼为 newer than 文件f1比文件f2新则为真
    f1 -ot f2 ,ot的全拼为older than 文件f1比文件f2旧则为真

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

    字符串测试操作符

    常用字符串测试操作符 说明
    -n   若字符串长度不为0,则为真
    -z 若字符串长度为0,则为真
    “字符串1”  ==  “字符串2” 若字符串1等于字符串2,则为真
    “字符串1”  !=  “字符串2” 若字符串1不等于字符串2,则为真

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

    整数二元比较操作符

    在[]以及test中使用的比较符号 在(())和[[]]中使用的比较符号 说明
    -eq == 或 = 相等,全拼为  equal
    -ne !=

    不相等,全拼为 not equal

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

    逻辑操作符

    在[]和test中使用的操作符 在[[]]和(())中使用的操作符 说明
    -a && and ,与,两端都为真,才为真
    -o || or ,或, 两端有一个为真,就为真
    ! ! not ,非, 两端相反,则结果为真

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

    测试表达式符号 test [] [[]] (())
    边界是否需要空格 需要 需要 需要 不需要
    逻辑操作符 ! 、-a、 -o ! 、-a、 -o ! 、&& 、 || ! 、&& 、 ||
    整数比较操作符 -eq 、 -gt 、-lt、-ge 、-le -eq 、 -gt 、-lt、-ge 、-le -eq 、 -gt 、-lt、-ge 、-le 或  = 、>  、< 、 >= 、 <= = 、>  、< 、 >= 、 <=
    字符串比较操作符 = 、 == 、!= = 、 == 、!= = 、 == 、!= 不支持
    文件操作 -d、-f、-e、-r、-s、-w、-x、-L、-nt、-ot -d、-f、-e、-r、-s、-w、-x、-L、-nt、-ot -d、-f、-e、-r、-s、-w、-x、-L、-nt、-ot 不支持
    是否支持通配符匹配

    不支持

    不支持 支持 不支持

    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则用于终止所有语句并退出当前脚本。

    命令 说明
    break   n 如果省略 n ,则表示跳出整个循环,n 表示跳出循环的成熟
    continue n 如果省略 n ,则表示跳过本次循环,忽略本次循环的剩余代码,进行循环的下一次循环。n表示退到第 n 层继续循环
    exit n 退出当前 shell 程序,n 为上一次程序执行的状态返回值。n 也可以省略,在下一个 shell 里可通过  $?  接收 exit  n 的n值

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

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

     

    展开全文
  • 现在有两个shell脚本A和B,用A脚本去调用B脚本,B脚本中有一条将程序放到后台执行的语句。两脚本大体内容如下: A脚本: #!/bin/bash source /etc/profile source ~/.bash_profile B B脚本: #!/bin/bash ...
  • shell脚本基本语法详解

    万次阅读 多人点赞 2016-09-28 20:16:04
    编写shell脚本的时候,最前面要加上一行:#!/bin/bash,因为linux里面不仅仅只有bash一个解析器,还有其它的,它们之间的语法会有一些不同,所以最好加上这一句话,告诉系统要用这个解析器。一.shell变量shell变量和...

    ==> 学习汇总(持续更新)
    ==> 从零搭建后端基础设施系列(一)-- 背景介绍


    ==> 学习汇总(持续更新)
    ==> 从零搭建后端基础设施系列(一)-- 背景介绍


    编写shell脚本的时候,最前面要加上一行:#!/bin/bash,因为linux里面不仅仅只有bash一个解析器,还有其它的,它们之间的语法会有一些不同,所以最好加上这一句话,告诉系统要用这个解析器。

    一.shell变量

    shell变量和一些编程语言不同,一般shell的变量赋值的时候不用带“$”,而使用或者输出的时候要带“$”。加减乘除的时候要加两层小括号。括号外面要有一个“$”,括号里面的变量可以不用“$”。需要注意的是,变量赋值,变量使用的时候不能有空格,否则会被解析成命令,报错无此命令。

    例子:

    #!/bin/bash
    
    a=10
    b=20
    c="this is a test"
    d=$((a+b))
    e=$((a-b))
    f=$((a*b))
    g=$((a/b))
    h=$((a%b))
    i=$((a**3))
    
    echo $c
    echo "a = "$a          #输出a的值
    echo "b = "$b          #输出b的值
    echo "a+b = "${d}      #输出a+b的值
    echo "a-b = "${e}      #输出a-b的值
    echo "a*b = "${f}      #输出a*b的值
    echo "a/b = "${g}      #输出a/b的值
    echo "a%b = "${h}      #输出a%b的值
    echo "a^3 = "${i} 	   #输出a的3次方的值
    
    echo "a+b = "$((a+b))  #输出a+b的值
    echo "a-b = "$((a-b))  #输出a-b的值
    echo "a*b = "$((a*b))  #输出a*b的值
    echo "a/b = "$((a/b))  #输出a/b的值
    echo "a%b = "$((a%b))  #输出a%b的值
    echo "a^3 = "$((a**3)) #输出a的3次方的值
    
    echo $((a+b*a-b/a+a%b+a**2)) #表达式可以很长
    
    

    结果如下图:

    二.shell变量表达式

    例子:

    #!/bin/bash
    
    str="a b c d e f g h i j"
    
    echo "the source string is "${str}                         #源字符串
    echo "the string length is "${#str}                        #字符串长度
    echo "the 6th to last string is "${str:5}                  #截取从第五个后面开始到最后的字符
    echo "the 6th to 8th string is "${str:5:2}                 #截取从第五个后面开始的2个字符
    echo "after delete shortest string of start is "${str#a*f} #从开头删除a到f的字符
    echo "after delete widest string of start is "${str##a*}   #从开头删除a以后的字符
    echo "after delete shortest string of end is "${str%f*j}   #从结尾删除f到j的字符
    echo "after delete widest string of end is "${str%%*j}     #从结尾删除j前面的所有字符包括j
    
    

    结果如图:

    三.shell测试判断test或[]

    需要注意的是使用[]的时候必须要每个变量之间都要有空格,和左右中括号也要有空格,否则报错。

    
    echo "Please input a filename: "
    read filename
    echo "by test\n"
    test -f $filename && echo "the file is ordinary file" || echo "the file is not ordinary file"
    test -d $filename && echo "the file is document folder" || echo "the file is not document folder"
    test -r $filename && echo "the file can read" || echo "the file can not read"
    test -w $filename && echo "the file can write" || echo "the file can not write"
    test -x $filename && echo "the file can executable" || echo "the file can not executable"
    
    echo "by []\n"
    [ -f $filename ] && echo "the file is ordinary file" || echo "the file is not ordinary file"
    [ -d $filename ] && echo "the file is document folder" || echo "the file is not document folder"
    [ -r $filename ] && echo "the file can read" || echo "the file can not read"
    [ -w $filename ] && echo "the file can write" || echo "the file can not write"
    [ -x $filename ] && echo "the file can executable" || echo "the file can not executable"
    
    echo "Please input two numbers:"
    read num1
    read num2
    
    echo "num1 = "${num1}
    echo "num2 = "${num2}
    echo "by test\n"
    test $num1 -eq $num2 && echo "num1 == num2" || echo "num1 != num2"
    test $num1 -ne $num2 && echo "num1 != num2" || echo "num1 == num2"
    test $num1 -gt $num2 && echo "num1 > num2" || echo "num1 <= num2"
    test $num1 -lt $num2 && echo "num1 < num2" || echo "num1 >= num2"
    test $num1 -ge $num2 && echo "num1 >= num2" || echo "num1 < num2"
    test $num1 -le $num2 && echo "num1 <= num2" || echo "num1 > num2"
    
    echo "by []\n"
    [ $num1 -eq $num2 ] && echo "num1 == num2" || echo "num1 != num2"
    [ $num1 -ne $num2 ] && echo "num1 != num2" || echo "num1 == num2"
    [ $num1 -gt $num2 ] && echo "num1 > num2" || echo "num1 <= num2"
    [ $num1 -lt $num2 ] && echo "num1 < num2" || echo "num1 >= num2"
    [ $num1 -ge $num2 ] && echo "num1 >= num2" || echo "num1 < num2"
    [ $num1 -le $num2 ] && echo "num1 <= num2" || echo "num1 > num2"
    
    

    结果如图:

    四.shell条件分支结构语句

    1.单分支判断语句

    格式:if 条件 ; then 结果 fi ,最后面一定要有fi,在shell脚本里面,控制分支结构结束都要和开头的单词相反,例如,if <–> fi,case <–> esac。

    #!/bin/bash
    
    echo "Please input a filename"
    read filename
    if [ -f $filename ];then
    echo "this file is a ordinary file."
    fi
    
    

    结果如图:

    2.双分支判断语句

    echo "Please input a filename"
    read filename
    if [ -f $filename ];then
    echo "this file is a ordinary file."
    else
    echo "this file is not a ordinary file."
    fi
    
    

    结果如图:

    3.多分支判断语句

    多分支判断有两种,和C语言的一样 if else if,case。只是形式上有一些不同。

    #!/bin/bash
    
    echo "Please input your math grades"
    read grades
    
    if [ $grades -gt 100 ] || [ $grades -lt 0 ];then
    echo "Please input the number range in 0 - 100"
    fi
    
    if [ $grades -ge 90 ] && [ $grades -le 100 ];then
    echo "Your grade is excellent."
    elif [ $grades -ge 80 ] && [ $grades -le 89 ];then
    echo "Your grade is good."
    elif [ $grades -ge 70 ] && [ $grades -le 79 ];then
    echo "Your grade is middle."
    elif [ $grades -ge 60 ] && [ $grades -le 69 ];then
    echo "Your grade is passing."
    else
    echo "Your grade is badly."
    fi
    
    

    结果如图:

    #!/bin/bash
    
    echo "Please input a command"
    read cmd
    case $cmd in
    cpu)    echo "The cpu information is"
            cat  /proc/cpuinfo;;
    mem)    echo "The mem information is"
            cat /proc/meminfo;;
    device) echo "The device information is"
            cat /proc/scsi/device_info;;
    CD-ROM) echo "The CD-ROM information is"
            cat /proc/sys/dev/cdrom/info;;
    *)      echo "Your input command is invalid"
    esac
    
    

    结果如图:

    五.shell循环语句

    1.while语句

    while语句是只要条件为真就执行下面语句。
    格式:
    while 条件
    do
    语句
    done

    需要注意的是,这里的条件除了 while true 可以这样写,其它的条件都要用 test或者 []来判断

    #!/bin/bash
    
    i=$1
    while [ $i -gt 0 ]
    do
    echo $i
    ((i--))
    done
    
    

    2.until语句

    until语句是只要条件为假就执行下列语句
    格式:
    until 条件
    do
    语句
    done

    #!/bin/bash
    
    i=$1
    until [ $i -le 0 ]
    do
    echo $i
    ((i--))
    done
    
    

    结果如图:

    3.for语句

    格式:
    for 变量 in 列表
    do
    语句
    done

    #!/bin/bash
    
    
    for i in `seq 2 8` #seq是一个命令,顺序生成一串数字或者字符
    do
       echo $i
    done
    
    

    结果如图:

    六.shell函数

    格式:
    [function] funcName()
    {
    语句
    [return 返回值]
    }
    返回值是可选的,如果没有显示return 则默认返回最后一条语句执行的结果。

    Shell 函数返回值只能是整数,一般用来表示函数执行成功与否,0表示成功,其他值表示失败。如果 return 其他数据,比如一个字符串,往往会得到错误提示:“numeric argument required”。

    如果一定要让函数返回字符串,那么可以先定义一个变量,用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数返回值。

    函数参数从$1$n$0 是文件名。

    例子:

    #!/bin/bash
    
    #打印数字
    printNum()
    {
       echo $1
    }
    
    for i in `seq 2 8` #seq是一个命令,顺序生成一串数字或者字符
    do
    printNum $i
    done
    
    

    结果如图:

    返回字符串,报错

    #!/bin/bash
    
    #打印字符串
    printNum()
    {
       return "Hello"
    }
    
    for i in `seq 2 8` #seq是一个命令,顺序生成一串数字或者字符
    do
    printNum
    done
    
    

    结果如图:

    展开全文
  • 收藏!一篇教会你写90%的shell脚本

    万次阅读 多人点赞 2019-09-06 18:18:36
    还不会写shell脚本?这篇文章教会你写90%的shell脚本
  • Shell脚本中调用其他Shell脚本

    千次阅读 2018-07-26 08:56:42
    在Linux平台上开发,经常会在console(控制台)上执行另外一个脚本...我们先来了解一下在一个shell脚本中如何调用另外一个shell脚本,其方法有 fork exec source。 1、fork ( /directory/script.sh) : 如果shell...
  • 以Linux系统为例,linux系统里面有很多个命令,脚本可以是一个或者多个命令的集合,通过运行...shell与批处理的比较:Linux环境下有个脚本语言叫做shell,一般的,shell脚本文件以.sh结尾,.sh并没有什么实际作用...
  • 快速入门Shell脚本(1)——Shell脚本的介绍

    千次阅读 多人点赞 2020-07-23 19:24:24
    1.什么是shell 同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中...
  • shell 脚本包含另一个 shell 脚本

    千次阅读 2012-05-22 12:03:41
    脚本 first (测试示例1) 下面是第一个脚本:first #!/bin/bash echo 'your are in first file' 方法一:使用source #!/bin/bash echo 'your are in second file' source first 方法二:使用. #!/bin/...
  • shell脚本图书

    千次阅读 2013-05-29 11:17:09
    《高级Bash脚本编程指南》《Linux命令行和Shell脚本编程》Linux与UNIX Shell编程指南--------------------已看!unix shell编程(第三版)Shell十三问实战LINUX+SHELL编程与服务器管理linuxsir的shell脚本赏析shell...
  • IDEA中编写并运行shell脚本

    万次阅读 多人点赞 2018-07-31 09:25:37
    IEDA中的bashsupport插件支持在IDEA中编写shell脚本文件,有友好的代码格式,支持自动补全,检查错误,并且配置完之后,还可以在IEDA中直接运行shell脚本。下面将一步一步演示插件的安装和配置。 打开IEDA,安装...
  • Shell脚本了解

    千次阅读 2016-02-26 15:52:28
    一、什么事ShellShell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过...二、Shell 脚本Shell
  • 1Shell脚本调试方法 Shell提供了一些用于调试脚本的选项: -n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误。-v,一边执行脚本,一边将执行过的脚本命令打印到标准错误输出。-x,提供跟踪执行信息,将...
  • shell脚本自动生成注释,这样以后写脚本就会方便很多
  • Shell 脚本中调用另一个 Shell 脚本的三种方式

    万次阅读 多人点赞 2017-07-28 23:38:09
    先来说一下主要以下有几种方式: ...forkfork 是最普通的, 就是直接在脚本里面用 path/to/foo.sh 来调用 foo.sh 这个脚本,比如如果是 foo.sh 在当前目录下,就是 ./foo.sh。运行的时候 terminal 会
  • 之前想着在windows下和linux下调用一些python Scrapy的接口,发现路径问题,传参数问题都挺麻烦,遂改为在bat文件和shell中具体写方法,然后执行他们就好了 1.执行bat脚本 (1)传入参数 bat处理文件中可引用的参数...
  • Shell 脚本也可以看做是一个一个的函数,将命令进行了封装。 看看自己的例子: outTop.sh 是最顶层的。【负责调用其他的shell 脚本】out1.sh 是第2层。【被outTop.sh调用】outInsert是第2层。【被outTop.sh调用】 ...
  • Shell - 传递参数到Shell 脚本

    千次阅读 2019-10-26 10:41:41
    文章目录Shell - 传递参数到Shell 脚本1、参数传递规则2、参数引用规则3、执行文件参数4、获得传递的参数个数5、其它特殊组合 Shell - 传递参数到Shell 脚本 1、参数传递规则 以空格分隔开 ./xxx.sh 1 2 3 2、参数...
  • mac终端下运行shell脚本   1、写好自己的 脚本,比如aa.sh    2、打开终端 执行,方法一: 输入命令 ./aa.sh ,   方法二:直接把 aa.sh 拖入到终端里面。   注意事项:   如果 没有成功报出问题::...
  • crontab运行脚本存在两大问题:环境变量和路径,从而导致单独运行脚本没问题,但用crontab运行就报错。 1、环境变量  描述问题:crontab: usage error: no arguments permitted after this option  因为crontab...
  • 【Shell】shell脚本中的空格

    千次阅读 2018-10-12 12:13:26
    1.定义变量时, =号的两边不可以留空格. eg: gender=femal————right gender =femal———–wrong gender= femal———–wrong ...gender= test————right 左边是命令的话=号的右边有空格是正确的=左边不能有...
  • shell脚本打印日志

    万次阅读 2018-03-05 16:31:31
    #!/bin/bash LOG_FILE="/var/log/test.log" ...第三行是把当前脚本的标准输出,标准错误输出都重定向到文件LOG_FILE中 第四行是打印每一行shell命令执行 exec是用被执行的命令行替...

空空如也

1 2 3 4 5 ... 20
收藏数 372,382
精华内容 148,952
关键字:

shell脚本