美文网首页
shell脚本了解

shell脚本了解

作者: WhiteStruggle | 来源:发表于2020-09-14 20:20 被阅读0次

    [toc]

    shell版本

    擅长处理纯文本类型的数据

    弱类型语言

    通用的标准 Bourne shell (sh)C shell (csh) ,其中 Bourne shell (sh)bash shell 取代

    优势: 在于处理操作系统底层业务(大量的命令)

    shell种类

    • Bourne shell ( 包括 sh、ksh、bash )
    Bourne shell (sh)
    Korn shell (ksh)
    Bourne Again shell (bash)
    POSIX shell (sh)
    
    • C shell ( 包括 sch 、 tcsh)
    C shell (csh)
    TENEX/TOPS C shell (tcsh)
    

    常见操作系统的默认shell

    • linuxBourne Again shell (bash)
    • SolarisFreeBSDBourne shell (sh)
    • AIX (IBM的Unix) 是 Korn shell (ksh)
    • HP-Unix( 惠普的Unix) 是 POSIX shell (sh)

    查看linux系统默认的shell:

    方法一:
    root@ubuntu:~# echo $SHELL
    /bin/bash
    
    方法二:
    root@ubuntu:~# grep root /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    nm-openvpn:x:117:125:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin
    

    shell脚本的建立和执行

    使用编辑器 vi/vim 编辑器

    脚本开头

    #!/bin/bash   标准写法
    或
    #!/bin/sh
    

    #! 称为 幻数,在执行 bash 脚本时,内核会确定用什么解释脚本的内容,必须在脚本的第一行,否则会被解释为 注释

    Linux中常见脚本开头的编码语法:

    #!/bin/sh
    #!/bin/bash
    #!/bin/sed          # sed 脚本
    #!/usr/bin/awk      # awk 语言
    #!/usr/bin/env python # python 语言
    #!/usr/bin/expect
    #!/usr/bin/perl
    #!/usr/bin/tel
    

    若脚本开头不指定解释器,则需要对应的解释器来执行脚本

    脚本注释

    shell脚本 中 井号(#) 后面的内容都是注释的内容

    bash 与 dash

    Debian和Ubuntu中,/bin/sh默认已经指向dash,是一个不同于bash的shell,它主要是为了执行脚本而出现,而不是交互,它速度更快,但功能相比bash要少很多,语法严格遵守POSIX标准

    root@ubuntu:~# ls -l /bin/sh
    lrwxrwxrwx 1 root root 4 11月 12  2019 /bin/sh -> dash
    
    root@ubuntu:~# ll /bin/sh
    lrwxrwxrwx 1 root root 4 11月 12  2019 /bin/sh -> dash*
    

    dash解释器可能会使得一些bash语法写的shell 脚本不能运行

    切换默认的 /bin/sh 指向 bash

    root@ubuntu:~# sudo dpkg-reconfigure dash
    
    弹出界面修改,询问你是否使用dash作为默认的 /bin/sh
    
    修改的话就选择: 否 
    

    修改之后查看

    root@ubuntu:~# ls -l /bin/sh
    lrwxrwxrwx 1 root root 4 7月  25 11:04 /bin/sh -> bash
    

    脚本的执行

    shell 脚本是 以 非交互的方式运行时,先查找环境变量( ENV ),该变量指定了一个环境文件( .bashrc) ,然后改环境变量文件开始执行,读取env文件后,开始执行shell脚本内容

    linux 环境下的 /etc/profile 存放至全局的环境变量文件

    若文件定义的变量放在etc/profile.d/目录中,会默认为环境变量

    查看用户的环境变量:

    ll /home/yz-0127/ -al
    

    shell脚本的执行通常可以采用的方式:

    1. bash 脚本全路径sh 脚本全路径

    当脚本文件本身没有可执行权限,或者文件开头没有指定解释器

    yz-0127@ubuntu:~$ bash /mysh/demo.sh
    hello World!
    
    1. 脚本全路径
    yz-0127@ubuntu:~$ /mysh/demo.sh
    hello World!
    
    1. source 脚本全路径. 脚本全路径
    yz-0127@ubuntu:~$ source /mysh/demo.sh
    hello World!
    

    注意:利用tab补全路径,当不能补全时,说明没有文件的权限

    反引号( ` ` ) 会解释 一些命令

    source和.与其他方式的区别

    source. 相当于 PHP 中的 include ,引入其他脚本的文件

    root@ubuntu:~# cat 5.sh
    #!/bin/bash
    user=`whoami`
    root@ubuntu:~# bash 5.sh
    root@ubuntu:~# echo $user
    
    root@ubuntu:~# source 5.sh
    root@ubuntu:~# echo $user
    root
    root@ubuntu:~# 
    

    基本规范

    1. 开头指定脚本解释器
    #!/bin/bash
    
    1. 开头加上版本版权等信息
    # Date :更新时间
    # Author : 作者
    # Mail: 邮箱
    # Function : 脚本功能
    # Version  : 版本
    

    可以配置vim编辑文件时自动加上信息,方法时 修改 /.vimrc 配置文件

    1. 脚本中尽量不要用中文,注释也用英文标识

    linux对中文支持不好

    1. 扩展名 .sh
    1. 中括号[] 两端要有空格
    [ yz ]
    
    1. 流程控制语句 一次性完成轮廓,然后再书写具体内容
    1. 通过缩进使代码更易读

    变量基础及深入

    分类:

    • 环境变量(全局变量)
    • 局部变量

    局部变量只能在创建他们的shell函数或脚本中使用

    环境变量也称全局变量,可以在创建他们的shell函数 及其 派生出来的任意子进程shell中使用

    存在着一些专用的shell变量

    环境变量

    环境变量可以在命令行中设置,但档用户退出时,这些变量值就会丢失,因此最好在用户 /home 目录下 的 .bash_profile 文件中或 全局配置 /etc/bash.bashrc /etc/profile 文件 或 /etc/profile.d/ 中定义

    系统在加载过程中,会把先把全部的全局变量加载

    将环境变量方如 profile 文件中,每次用户登录时这些变量都会被初始化

    • 所有的环境变量大写
    • 环境变量用于用户进程前,必须使用export内置命令导出的变量

    例如:

    root@ubuntu:~# echo $HOME
    /root
    root@ubuntu:~# echo $USER
    root
    root@ubuntu:~# echo $uid
    
    root@ubuntu:~# echo $UID
    root@ubuntu:~# echo $UID
    0
    root@ubuntu:~# echo $SHELL
    /bin/bash
    

    设置环境变量

    在给变量赋值之后或设置变量时使用 export 命令

    或者 带 -x 选项的 declare 内置命令

    注意 : 输出变量时候不能再变量名前加 $

    格式:

    (1) export 变量名 = value
    
    (2) 变量名 = value : export 变量名
    
    (3) declare -x 变量名 = value
    

    自定义环境变量,在生产环境中需要一些配置文件,例如 java环境配置实例

    一般的配置环境变量放在 /etc/profile`

    取消环境变量

    显示默认的环境变量:

    root@ubuntu:~# env
    root@ubuntu:~# printenv
    root@ubuntu:~# set
    

    unset 取消 本地变量和环境变量

    root@ubuntu:~# echo $USER
    root
    root@ubuntu:~# unset USER
    root@ubuntu:~# echo $USER
    
    root@ubuntu:~# 
    

    unset 取消变量,退出用户,再次登录还是会存在,想要彻底取消,需要书写的配置文件中

    局部变量(本地变量)

    本地变量在用户当前的shell生存期的脚本中使用

    当在shell中启动另一个进程或退出,本地变量就会失效

    定义方法:

    变量名 = value
    
    用于:直接定义变量的内容,内容一般为简单连续的数字、字符串、路径名等
    
    a = 33
    b = yes
    
    变量名 = 'value'
    
    单引号定义变量 , 内容中是什么就会输出什么,变量不会被解析
    用于:定义显示纯字符串
    
    a = 'WRONG'
    
    变量名 = "value"
    
    双引号定义变量
    用于:字符串中附带有变量的内容的定义
    
    a = "this is wrong"
    

    例如:

    root@ubuntu:~# a=192.168.1.2
    root@ubuntu:~# b='193.168.1.2'
    root@ubuntu:~# c="194.168.1.2"
    root@ubuntu:~# echo "a=$a"
    a=192.168.1.2
    root@ubuntu:~# echo "b=$b"
    b=193.168.1.2
    root@ubuntu:~# echo "c=${c}"
    c=194.168.1.2
    root@ubuntu:~# 
    

    单引号'' 不会解析其内容

    root@ubuntu:~# echo 'a=$a'
    a=$a
    

    命名规范:

    1. 变量命名要统一,使用大写字母
    2. 予以要清晰,能够表达变量内容的含义
    3. 过长的单词使用 单词前几个字母 代替
    4. 多个单词连接使用 "_" 连接
    5. 避免无含义的字符或数字
    6. 使用变量时,采用大括号,会比较清晰
    7. 字符串变量通常用双引号括起来,减少怪异的错误

    局部变量规范:

    使用local定义变量,代表只在脚本中的函数体生效

    local a;
    

    把命令定义为变量

    1. 利用 反引号( `` ) ,定义变量
    root@ubuntu:~# time=`date +%F`
    root@ubuntu:~# echo $time
    2020-07-29
    
    1. 利用小括号,定义变量 (常用)
    root@ubuntu:~# time=$(date +%F)
    root@ubuntu:~# echo $time
    2020-07-29
    

    相关文章

      网友评论

          本文标题:shell脚本了解

          本文链接:https://www.haomeiwen.com/subject/ltktyktx.html