shell脚本编写_shell脚本编写计算器 - CSDN
精华内容
参与话题
  • 基于linux下的shell脚本编写

    万次阅读 2018-06-14 04:34:55
    (sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用php写shell 脚c脚本练习:[root@localhost ~]# yum install gcc -y 安装gcc编译[root@localhost ~]# vim hello.c 编辑c语言文[root@localhos...

    shell脚本

    (课前了解)c脚本编写:

    [root@localhost ~]# yum install gcc -y  安装gcc编译
    [root@localhost ~]# vim hello.c  编辑c语言文
                       #include<stdio.h>
                       void main ()
                       {
                       printf("hello world\n");
                       }
    
    [root@localhost ~]# gcc hello.c  默认编译生成a.out文件
    [root@localhost ~]# ls
    anaconda-ks.cfg  Desktop    Downloads  ip_show.sh  Pictures  Templates
    a.out            Documents  hello.c    Music       Public    Videos
    [root@localhost ~]# ./a.out  执行编译之后的a.out文件
    hello world
    [root@localhost ~]# gcc hello.c -o hello -o表示编译成为自己想要的文件名字
    [root@localhost ~]# ls
    anaconda-ks.cfg  Desktop    Downloads  hello.c     Music     Public     Videos
    a.out            Documents  hello      ip_show.sh  Pictures  Templates
    [root@localhost ~]# ./hello  运行c脚本
    hello world

    shell 脚本编写

    一、基本写法

    vim /mnt/XXXX.sh
    #!/bin/bash
    执行:(1)   sh  XXXX.sh
              (2)    chmod +x  /mnt/XXXX.sh
                /mnt/XXXXX.sh

    二、脚本前面内容的自动添加
    [root@localhost mnt]# vim /etc/vimrc
    autocmd BufNewFile *.sh exec ":call WESTOS()"             (末尾添加)
    func WESTOS ()
          call append(0,"##############################")
          call append(1,"#Author:    xd".("               #"))
          call append(2,"#Version:     ".("               #"))
          call append(3,"#Mail:        ".("               #"))
          call append(4,"#Date:      ".strftime("%Y-%m-%d").("       #"))
          call append(5,"#Description:    ".("            #"))
          call append(6,"#                ".("            #"))
          call append(7,"##############################")
          call append(8,"  ")
          call append(9,"#!/bin/bash")
    endfunc
    [root@localhost mnt]# vim westos.sh
    ##############################
    #Author:    xd               #
    #Version:                    #
    #Mail:                       #
    #Date:      2018-06-09       #
    #Description:                #
    #                            #
    ##############################

    #!/bin/bash



    三 、shell脚本中常用的命令

    1、   diff

    1)比较不同,生成补丁不保存原文件

    148  vim westos

                 westos
      149  vim westos1
                westos
                  linux
      150  diff  westos westos1     比较文件westos和westos1文件的不同(以后面的文件为标准)
      151  diff  -u westos westos1     生成文件补丁
      152  diff  -u westos westos1  > westos.path   把生成的补丁导入westos.path文件中
      153  yum install patch -y
      154  patch westos westos.path      给文件westos添加补丁   (不保存westos原文件)
      155  ls
      156  cat westos
            westos
            linux
      157  cat westos1
            westos

            linux   


    2)比较不同,生成补丁不保存原文件
      168  vim westos
            westos
      169  vim westos1
            westos
            linux
      170  diff  -u westos westos1  > westos.path     比较文件westos和westos1文件的不同(以后面的文件为标准)并生成补丁导入westos.path
      171  patch -b  westos westos.path    给文件westos添加补丁(保存原文件)
      172  ls
      173  cat westos.orig
           westos
      174  cat westos
           westos

           linux


    (3)比较两个目录的不同
    [root@localhost mnt]# mkdir linux
    [root@localhost mnt]# mkdir unix
    [root@localhost mnt]# ls
    linux  unix  westos  westos1  westos.orig  westos.path
    [root@localhost mnt]# touch linux/file
    [root@localhost mnt]# diff -r linux   unix

    Only in linux: file



    2、cut

    cut      命令多用与字符截取

    cut -d ##指定分隔符
    cut -f 1,7(第1和第7列)|1-7 (第一到第七列) ##指定截取的列
    cut -c 1,4(第一个分隔符前和第四个分隔符前内容)|1-4(第一个分隔符到第四个分隔符) ##指定截取的字符位置

    脚本练习:显示本机ip

    [root@localhost mnt]# cat ip_show.sh
    ##############################
    #Author:    xd               #
    #Version:                    #
    #Mail:                       #
    #Date:      2018-06-09       #
    #Description:                #
    #                            #
    ##############################
     
    #!/bin/bash

    ifconfig  eth0 |grep "inet "|cut -d " " -f 10

    或者:ifconfig  eth0 | awk -F "  " '/inet\>/{print  $2}'

    测试:  sh  ip_show.sh


    3、sort(字符排序

    sort -n 纯属字排序                                   
    sort -r 倒序
    sort -u 去掉重复数字

    sort -o 输出到指定文件中

    sort -t 指定分隔符

    sort -k 指定要排序的列

    uniq   对重复字符做相应的处理

    uniq -u 显示唯一的行

    uniq -d 显示重复的行

    uniq -c 每行显示一次并统计重复次数

      223  cat westos
      224  sort westos
      225  sort -n westos  纯数字排序
      226  sort -rn westos    纯数字倒序排列
      228  sort -nu westos     去掉重复的数字进行排序
      229  sort -nu westos -o  /mnt/file   去掉重复的数字进行排序输出到指定文件/mnt/file
      230  ls

      231  cat file


      232  vim westos
      233  sort -t : -k 2 westos
      234  sort -t : -k 2 -n westos   :后的第二列纯数字排序
      235  uniq -u westos      显示唯一的行
      236  uniq -d westos     显示重复的行  
           uniq  -c  westos     每行显示一次并统计重复次数
      237  vim westos
      238  cat westos
      239  sort -n westos | uniq -c
      240  sort -n westos | uniq -d

      259  sort -n westos | uniq -u


    4、&&和||

    &&用来执行条件成立后执行的命令
    ||用来执行条件不成立后执行的命令

    脚本练习:测试ip是否可以ping通
    [root@localhost mnt]# cat check_ip.sh
    ##############################
    #Author:    xd               #
    #Version:                    #
    #Mail:                       #
    #Date:      2018-06-09       #
    #Description:                #
    #                            #
    ##############################
     
    #!/bin/bash

    ping -c1 -w1 $1 &> /dev/null && echo $1 is up || echo $1 is down

    测试   sh  check_ip.sh   172.25.254.55


    5、对比检测

    test命令和[  ]等同
    test"$A" ="$B"  等同  [ "$A" = "$B" ]
    ge  大于等于[ "$A" -ge"$B" ]
    gt   大于[ "$A" -gt "$B" ]
    =   [ "$A" = "$B" ]  对比A和B是否相等
    !=  不等于   [ "$A" != "$B" ]       
    -eq  等于[ "$A" -eq "$B" ]
    -ne   不等于[ "$A" -ne "$B" ]
    -le   小于等于[ "$A" -le "$B" ]
    -lt   小于[ "$A" -lt "$B" ]
    -a   两者都满足[ "$A" -ne "$B" ] -a [ "$A" -ne "$B" ]

    -o   满足一个[ "$A" -ne "$B" ]  -o[ "$A" -lt "$B" ]

    脚本练习:检测数字是否在10以内

    #!/bin/bash
    [ -z  "$1" ] && {
              echo please give me number!!
              exit 1
    }
    [ "$1" -lt "10" -a "$1" -gt "0" ] && {
              echo "yes, $1 is between 1~10 "
    }||{
              echo "no,$1 is not between 1~10"

    }

    测试:sh  check_num.sh   7

    sh  check_num.sh   20


    文件1 -ef 文件2  文件1和文件2是否互为硬连接(一个节点)

    cd /mnt

    touch file

    ln /mnt/file  /mnt/file1

    ls -l

    [ "/mnt/file"  -ef   "/mnt/file1" ] &&  echo yes ||echo no

    文件1 -nt  文件2  文件1生成时间是否比文件二新

    rm   -fr *

    touch file

    touch file1

    [  "file" -nt  "file1" ] && echo yes ||  echo no

    文件1  -ot  文件2  文件1生成时间是否比文件二老

    [  "file" -nt  "file1" ] && echo yes ||  echo no

    -e "file"        文件是否存在
    -f "file"        文件是否为普通文件
    -L "file"        是否为软连接
    -S "file"        是否为套节字
    -b "file"        是否为块设备
    -d "file"        是否为目录

    -c "file"        是否为字符设备

    脚本练习:检测某个文件是否存在,若存在指出什么类型文件

    vim file_check.sh

    #!/bin/bash

    [ -z  "$1" ] && {
              echo  "please input a file name after script!!"
              exit 1

    }

    [ -e  "$1" ] || {

               echo  "$1  is not exist"

               exit  0

    }

    [ -L  "$1" ] |&& {

               echo  "$1  is a link "

               exit  0

    }

    [ -f  "$1" ] &&{

               echo  "$1  is a common file"

               exit  0

    }

    [ -b  "$1" ] && {

               echo  "$1  is  a block  file"

               exit  1

    }

    测试:

    sh file_check.sh

    sh file_check.sh  file

    sh file_check.sh   /dev/vdb

    sh file_check.sh  /etc/system-release

    sh file_check.sh   /etc/passwd


    6、tr        字符转换

    脚本练习:

    #!/bin/bash  

    WORD=$(echo  $1  |  tr  'A-Z'  'a-z')        将字符A-Z转换为a-z

    [   "$WORD" = "hello" ] &&{

                    echo yes

    } || {

                   echo  no

    }

    测试:

    sh test.sh  hello

    sh test.sh   HELLO



    脚本练习:检测系统中是否存在此用户,若不存在则建立此用户并赋予其密码

    #!/bin/bash

    [ "$#"  -eq  "2"  ] || {

                    echo "please  input  username  and password  after  script!!"

                    exit  1

    }

    Check_User=` getent  passwd $1`

    [  -n   "$Check User"  ]&&{

                   echo  $1 is exist!!

                   exit   1

    }

    useradd    $1

    echo     $2  | passwd   --stdin   $1

    sh user.sh    student  

    sh user.sh   student     student

    sh   user.sh   tom      tom


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

    万次阅读 多人点赞 2018-10-08 11:22:35
    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脚本编写(一)

    万次阅读 多人点赞 2015-01-24 18:23:39
    所以,今天就抽出一些时间学习学习Shell脚本。 shell有两种执行命令的方式: 交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。 批处理(Batch):用户事先写一个Shell脚本...

    努力让自己工作变得高效,会写脚本,会用脚本,往往事半功倍。所以,从今天开始抽出一些时间学习,通过4节内容熟悉和入门shell脚本!

    --------------前方高能预警,本文写的略自娱自乐,如有看着不适,请狂戳右上角----------------------

    shell有两种执行命令的方式:

    交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。

    批处理(Batch):用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。

    我们要知道bash和sh不是一个东西,我们需要了解,bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行。


    由于本人是用vi写的,刚开始用vi会感觉这东西尼玛是人用的么,难用的要死,如果决定用vim编辑器,在开始写shell之前,还是默默的熟悉一下vim的编辑命令吧。可以参考链接http://blog.csdn.net/hnulwt/article/details/43062065

    来吧,开始写shell

    终端输入 vi test.sh

    开始编辑输入一下内容:(其实在vi编辑器里面输入内容是最难的了!!!)

    echo "Hi, SB"
    read PERSON
    echo "$PERSON, ni shi hou zi pai lai de dou bi ma ?"
    
    输入完毕后,按Esc,然后输入 wq,按enter

    好了已经保存并且退出了。(以上步骤如果还不够熟练,建议你换个姿势~再来一次闭嘴并且明白每个步骤的作用)

    接着运行,运行的话有好几种方式,这里用俩种吧

    第一种,输入 ./test.sh(注意!前面有个点,表示当前目录下)

    第二种,输入 sh test.sh (当然bash test.sh也可以啦,前面说了bash对sh兼容是很好的,当然我这里不是看敲sh方便嘛,就俩个字符。(尼玛!多敲俩个字符能死。。))

    好了,看看结果。咦?怎么不对。。。

    Linux有个权限系统,我们这样创建的文件是没有执行权限的,因为默认创建的文件权限是 -rw-r--r--,至于不了解这一出字符的意思,可以暂时先不管,我们在后面会讲到。在执行之前需要给他加权限,命令行输入 chmod +x ./test.sh,即可,这样就增加了可执行权限。(偶尔我会简单粗暴的chmod 777 ./test.sh,当然这不是什么好方法~,这个和前面说的是有区别的哈,可以通过 ls -l | grep test.sh 查看俩个赋予权限的区别),至于上面叙述的有疑问,可以直接回复提问

    好了,这下可以运行我们的程序了,敲入 ./test.sh 或 sh test.sh 运行,是不是有惊喜啊!居然说出了“Hi SB”,紧接着我输入了nima 然后后面的字符也就出来了。运行结果如下图:



    变量概念

    好了,第一个小程序运行成功了,接下来看看变量定义:

    例子:varibleName="value"

    首先有一点,变量名和等号之间不能有空格,这点千万注意,因为我们平时写其他程序的时候可能已经养成了这种习惯,在shell这里需要注意这个习惯,

    然后要知道的一些变量命名规则:

    1,首个字符必须为字母(a-z,A-Z)。

    2,中间不能有空格,可以使用下划线(_)。

    3,不能使用标点符号。

    4,不能使用bash里的关键字(可用help命令查看保留关键字)。

    定义好变量我们就要开始使用变量了,如何使用变量,需要在自己定义的变量名上加上大括号,然后最前面写上$字符,例如

    who="dog"

    echo who is ${who}?

    其实变量可以直接用$who取,但是为了养成好习惯,还是加上括号吧。

    接着我们对shell的变量类型做个了解,有三种变量:

    1 局部变量

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

    2 环境变量

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

    3 shell变量

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


    shell中一些比较特殊的变量:

    特殊变量 含义
    $0 当前脚本的文件名
    $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
    $# 传递给脚本或函数的参数个数。
    $* 传递给脚本或函数的所有参数。
    $@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
    $? 上个命令的退出状态,或函数的返回值。
    $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
    这些变量我们留在这里备份,有用到就可以查。

    算数运算

    Bash 支持很多运算符,包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。
    原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
    expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

    接着写一小段shell,按照下图:

    # /bin/bash
    value=`expr 2 + 2`
    echo "Total value :${value}"
    
    图中有几个点要注意,第一行是linux的注释,以#号开头。

    在第二行中注意赋值地方是没有空格的,而在计算表达式的时候之间是有空格的。 expr 2 + 2表达式被 ` 号括起来。注意 · 号并不是单引号,而是键盘上Esc下面的符号。(半角英文模式)

    运行结果

    Lee@Lee-PC /Desktop
    $ sh test.sh
    Total value :4

    好了接着跟我一起输入如下内容:

    # /bin/bash
    a=10
    b=20
    
    value=`expr 2 + 2`
    echo "Total value :${value}"
    
    value=`expr $a \* $b`
    echo "a * b : ${value}"
    
    value=`expr $b % $a`
    echo "a % b : ${value}"
    
    if [ $a == $b ]
    then
        echo "a equals b"
    fi
    
    if [ $a != $b ]
    then
        echo "a not equals b"
    fi
    

    一起看看运行结果是不是相同。

    $ sh test.sh
    Total value :4
    a * b : 200
    a % b : 0
    a not equals b

    对上面稍做说明:

    在计算a * b的时候,我们的表示有用到转义字符 \ (反斜杠) 

    条件表达式要放在方括号之间,并且要有空格,例如 [$a==$b] 是错误的,必须写成 [ $a == $b ]

    if...then...fi 是条件语句,后面我们会对其再进行了解

    关系运算

    接着上面的脚本,我们继续编辑输入:

    if [ $a -eq $b ]
    then
        echo "$a -eq $b"
    else
        echo "a not equals b "
    fi
    
    if [ $a -gt $b ]
    then
        echo "$a gt $b"
    else
        echo "a not greater than b"
    fi
    
    if [ $a -le $b ]
    then
        echo "$a le $b"
    else
        echo "a not less or equal to b"
    fi
    

    运行结果:(有前面编辑输入过的内容哈)

    $ sh test.sh
    Total value :4
    a * b : 200
    a % b : 0
    a not equals b
    a not equals b
    a not greater than b
    10 le 20

    好了,写脚本的时候就能猜出来-gt 和-le的作用吧。我们系统的来看看

    关系运算符列表

    运算符 说明 举例
    -eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 true。
    -ne 检测两个数是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
    -gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
    -lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
    -ge 检测左边的数是否大等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
    -le 检测左边的数是否小于等于右边的,如果是,则返回 true [ $a -le $b ] 返回 true。

    这次我们的shell脚本学习就到这里,后面还有一些内容一些运算符,还有字符串等等东西。


    展开全文
  • Shell脚本书写方法详解

    万次阅读 多人点赞 2018-05-31 12:04:02
    同学给我推荐了一个关于如何书写shell脚本教程文件。看过之后觉得受益良多,自己特意将该PDF内的内容自己总结了一份,在这里和大家分享一下。愿所有像我一样的shell脚本的初学者能够从中受益,少走弯路。首先,shell...
    同学给我推荐了一个关于如何书写shell脚本教程文件。

    看过之后觉得受益良多,自己特意将该PDF内的内容自己总结了一份,在这里和大家分享一下。
    愿所有像我一样的shell脚本的初学者能够从中受益,少走弯路。

    首先,shell的作用

    用户的登陆shell  登陆后默认的shell程序是: /bin/bash
    不同的shell内部指令,运行环境会有所区别

    常见的shell有
    /bin/sh
    /bin/bash
    /sbin/nologin


    1.编写脚本代码:
    使用vi编辑器,每行一条Linux命令,按照顺序执行

    2.然后赋予脚本文件可执行的属性

    3.执行脚本文件的三种方法
    ./chao.sh
    sh /chao.sh
    source /chao.sh

    更完善的脚本构成
    脚本声明
    注释信息
    可执行语句

    重定向操作
        类型                        操作符                      用途
    重定向输入                     <                        从指定文件读取而不是从键盘输入
    重定向输出                     >                         将输出文件保存到指定文件(覆盖原有内容)
                                          >>                      将输出文件保存到指定文件(覆盖原有内容)
    标准错误输出                  2>                      将错误信息保存到指定的文件(覆盖原有内容)
                                          2>>                    将错误信息保存到指定的文件
    混合输出                        &>                       将标准输出,标准错误的内容保存到同一文件中

    管道操作符号“|”
    将左侧的命令输出结果,作为右侧命令的处理对象


    shell变量的作用
    为灵活管理Linux系统提供的特定参数,有两层意思
    变量名:使用固定的名称,由系统预设或用户定义
    变量值: 能够根据用户设置,系统环境的变化而变化

    变量的类型
    自定义变量:由用户自己定义,修改和使用
    环境变量: 由系统维护,用于设置工作环境
    位置变量: 通过命令行给脚本程序传递参数
    预定义变量:BASH中内置的一类变量,不能直接修改

    定义一个新的变量
    格式: 变量名=变量值
    变量名以字母或下划线开头,区分大小写,建议全大写

    查看变量的值:   echo $变量名
    赋值时使用引号:
    双引号:允许使用$符引用其他变量值
    单引号: 禁止引用其他变量值,$视为普通字符
    反撇号:命令替换,提取命令执行后的输出结果

    将键盘输入内容为变量赋值
    格式:   read [-p "提示信息"] 变量名

    设置变量的作用范围
    export 变量名
    export 变量名=变量值
    两种格式可以混合使用

    整数变量的运算:
    expr  变量1 运算符  变量2 [运算符 变量3]
    常见的运算符
    加法运算符 +
    减法运算符: -
    乘法运算符:\*
    除法运算符: /
    取余运算:%

    整数变量的运算(2)
    ((变量=变量运算符变量));
    等号后面的变量可以是具体数值
    例子:
    ((a=a+3));

    环境变量:
    由系统提前创建,用来设置用户的工作环境
    配置文件: /etc/profile       ~/.bash_profile
    常见环境变量的举例

    位置变量:
    表示为$n, n为1~9之间的数字

    预定义变量: 
    /etc/passwd  /etc/shadow
    例如一些服务的内置用户名或密码
    如apache的启动用户就是预定义变量

    条件测试操作
    测试特定的 表达式是否成立,当条件成立时,测试语句的返回值为0,否则为其他数值
    格式 : test 条件表达式
    应用实例: 

                                       

                           

    test -z 进行测试的时候   字符串长度为0的时候   结果才返回1
                如果变量数值为0    返回0

    条件测试操作
    [ 操作符 文件或目录]
    [5]  部分是判断表达式,-d表示判断是否是目录
    &&是”逻辑与“操作符,只有&&前面的判断成立,后面的语句才会执行
    -b的意思是判断 后面的路径是否是一个目录
    echo $?    表示对刚刚执行的表达式进行判断
    0表示成立,1表示不成立

    -e filename     如果 filename存在,则为真     [ -e /var/log/syslog ]
    -d filename     如果 filename为目录,则为真     [ -d /tmp/mydir ]
    -f filename     如果 filename为常规文件,则为真     [ -f /usr/bin/grep ]
    -L filename     如果 filename为符号链接,则为真     [ -L /usr/bin/grep ]
    -r filename     如果 filename可读,则为真     [ -r /var/log/syslog ]
    -w filename     如果 filename可写,则为真     [ -w /var/mytmp.txt ]
    -x filename     如果 filename可执行,则为真     [ -L /usr/bin/grep ]
    filename1-nt filename2     如果 filename1比 filename2新,则为真     [ /tmp/install/etc/services -nt /etc/services ]
    filename1-ot filename2     如果 filename1比 filename2旧,则为真     [ /boot/bzImage -ot arch/i386/boot/bzImage ]
    字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
    -z string     如果 string长度为零,则为真     [ -z "$myvar" ]
    -n string     如果 string长度非零,则为真     [ -n "$myvar" ]
    string1= string2     如果 string1与 string2相同,则为真     [ "$myvar" = "one two three" ]
    string1!= string2     如果 string1与 string2不同,则为真     [ "$myvar" != "one two three" ]
    算术比较运算符
    num1-eq num2     等于    [ 3 -eq $mynum ]
    num1-ne num2     不等于    [ 3 -ne $mynum ]
    num1-lt num2     小于    [ 3 -lt $mynum ]
    num1-le num2     小于或等于    [ 3 -le $mynum ]
    num1-gt num2     大于    [ 3 -gt $mynum ]
    num1-ge num2     大于或等于    [ 3 -ge $mynum ]

    整数值比较
    格式: [ 整数1 操作符 整数2 ]

    字符串比较
    格式1: [ 字符串1 = 字符串2 ]
                 [ 字符串1 != 字符串2 ]
    格式2: [  -z 字符串 ]

    逻辑测试:
    格式1:  [ 表达式1 ]   操作符    [ 表达式2 ]
    格式2: 命令1  操作符   命令2


    if语句的结构


    while语句的语法结构




    展开全文
  • Linux shell 脚本编写

    千次阅读 2018-01-30 12:24:10
    知识点回顾: 1、Unix&Linux,GUN,Ubuntu,Red Hat,Fedora。 2、Linux用户管理。 —Root用户,普通用户,用户组。 —useradd,passwd,usermod,finger,sudo(su),groupadd,groups,whoami,who。...
  • shell脚本编写简易教程

    千次阅读 2018-04-22 17:18:05
    用了caffe有一段时间了,感觉自己写shell脚本的能力有待提高,特地从菜鸟笔记处系统的看了一遍,其实学习基础就可,内容也不多,我就不总结了。把网站上的内容用markdown重新编辑了一下,各位可以根据需要看看;参考...
  • Shell脚本简单使用

    2019-05-13 08:06:09
    执行shell脚本3. 编写规范4. 变量定义 1. 创建 创建.sh文件 用#! /bin/bash 开头 案例 #!/bin/bash echo "test" 2. 执行shell脚本 # 方法一(推荐使用) bash [name] # 方法二(没有可执行权限不可用) ./[name] ...
  • Shell脚本编写

    2012-02-08 17:06:39
    Shell脚本编写 Bash有几个开关和选项对于跟踪调试脚本是非常有用的。“-n”开关可以使你不用运行脚本就可以检查脚本语法的正确性。通常在开发期间使用这个开关来检查脚本的语法。 $ bash -n bad.sh bad.sh: ...
  • shell脚本编写思路

    千次阅读 2019-11-04 10:44:03
    编写shell脚本 2.学习/操作 shell有两种执行命令的方式://[按照交互性] 交互式(Interactive):解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。 批处理(Batch):用户事先写一个...
  • shell脚本编写计算器

    千次阅读 2018-11-16 14:24:08
    版权声明:本文为博主原创文章,转载请注明CSDN...shell脚本编写计算器: 直接上代码: #!/bin/bash falg="1" while [ "$falg" -eq "1" ] do echo "---shell迷你计算器---...
  • shell脚本编写笔记

    千次阅读 2019-07-26 14:32:28
    本文主要介绍如何编写简单的shell脚本,给shell脚本传参,shell脚本获取当前运行时间,通过shell执行hql语句。
  • shell脚本编写规范(超实用)

    千次阅读 2017-09-09 15:18:05
     shell脚本绝大部分命令自己平时也经常使用,但是在写成脚本的时候总觉得写的很难看。而且当我在看其他人写的脚本的时候,总觉得难以阅读。毕竟shell脚本杂糅不同的程序供我们调用。因此很多人在写的时候也是想到...
  • ubuntu终端:ctrl +art + T  cd /home/thomas 到thomas目录下 一、vi bigdata.sh 打开vim编辑器 二、i 输入内容 #!/bin/bash echo Hadoop Hive Hbase spark Esc shift + : ...chomd +x ./digd...
  • 8个实战及常用Shell脚本编写

    千次阅读 2018-10-02 12:46:38
    注意事项: 1).开头加解释器:#!...调试脚本两个命令:set -e遇到执行非0时退出脚本,set -x打印执行过程 6).一定要先测试,在加入到工程中 1.获取随机字符串或数字 获取随机8位字符串 获取随机8位数...
  • shell脚本编写教程(基于项目)

    千次阅读 2018-11-30 10:55:25
    最近几天公司要上线3.0版本了,需要将2.0版本的数据迁移到3.0数据库中,由于数据库改动非常大,所以采用了程序动态迁移数据。 一、环境 3.0项目 数据迁移项目 ...2、编写shell脚本,实现动态导入 #!/b...
  • 作为一名运维工程师,BashShell脚本编写必不可少。然而,大家会发现专门用来编写BashShell脚本的IDE少之又少。但是,即使这样也阻止不了我们自己通过vim来打造一款属于自己的BashShell脚本开发环境。通过以下命令及...
  • shell脚本编写小程序

    千次阅读 2017-06-29 16:03:09
    求1-100的加法,并输出1+2+3+4+5+6+7+…+100? #!/bin/bash sum=1 str='1' i=2 for (( i; i; i++)) do str=$str'+'$i let sum+=i done echo $str=$sum 因为‘+’不好处理,所以从2开始。...function m
  • 复制命令的Shell脚本编写示例

    千次阅读 2017-09-17 19:39:49
    编写脚本/root/bin/copycmd.sh: (1) 提示用户输入一个可执行命令名称 (2) 获取此命令所依赖到的所有库文件列表 (3) 复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下;如:/bin/bash ==> /mnt/sysroot/bin...
  • #!/bin/bash #安装jdk echo "选择Y开始 N结束,中断的话选择Ctrl+C" echo -n "select Y or N:" read NAME if [ "$NAME"... #find / -name apache-tomcat-6.0...
  • vim aa.sh #!/bin/bash #斐波那契数列后一个数字永远是前 2 个数字之和 #如:0 1 1 2 3 5 8 13 ...... list=(0 1) for i in `seq 2 11` ... list[$i]=`expr ${list[-1]} + ${list[-2]}` ...sh aa.sh ...
1 2 3 4 5 ... 20
收藏数 125,190
精华内容 50,076
关键字:

shell脚本编写