美文网首页
shell 脚本语言

shell 脚本语言

作者: 南方的小巷 | 来源:发表于2020-04-22 07:21 被阅读0次

    echo

    echo 是一个输出命令,可以用来输出数字、变量、字符串。

    [root@izwz9cyyo3i6o69tarbe2oz ~]# echo "C语言中文网"
    C语言中文网
    #   变量前加 $
    [root@izwz9cyyo3i6o69tarbe2oz ~]# echo $JAVA_HOME
    /usr/local/jdk1.7.0_60
    
    

    shell 脚本

    test.sh

    #!/bin/bash
    echo "What is your name?"
    #read 命令从 stdin 获取用户输入的内容并赋值给 PERSON 变量
    read PERSON  
    echo "Hello, $PERSON"
    

    #!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行

    echo 输出文本命令

    #及其后面的内容是注释

    运行脚本

    $ chmod +x ./test.sh  #设置文件执行的权限
    $ ./test.sh   
    What is your name?
    mozhiyan
    Hello, mozhiyan
    $
    

    变量

    #定义变量   注意: = 周围不能有空格
    #已定义的变量,可以被重新赋值
    variable=value
    variable='value'
    variable="value"
    #使用变量
    author="严长生"
    echo $author
    echo ${author}
    #变量名外面的花括号{ }是可选的,加不加都行,
    #加花括号是为了帮助解释器识别变量的边界
    echo "I am good at ${author}Script"
    

    单引号和双引号的区别

    以单引号' '包围变量的值时,单引号里面是什么就输出什么

    以双引号" "包围变量的值时,输出时会先解析里面的变量和命令

    #!/bin/bash
    url="http://c.biancheng.net"
    website1='C语言中文网:${url}'
    website2="C语言中文网:${url}"
    echo $website1
    echo $website2
    ##运行结果
    #C语言中文网:${url}
    #C语言中文网:http://c.biancheng.net
    

    命令的结果赋值给变量

    variable=$(可执行的命令)
    variable=`可执行的命令`
    
    $ cd code
    $ log=$(cat log.txt) #推荐
    $ echo $log
    [2018-09-10 06:53:22] 正在编写Shell教程
    $ log=`cat log.txt`  #不推荐,易混淆
    $ echo $log
    [2018-09-10 06:53:22] 正在编写Shell教程
    

    只读变量

    #!/bin/bash
    myUrl="http://see.xidian.edu.cn/cpp/shell/"
    readonly myUrl
    myUrl="http://see.xidian.edu.cn/cpp/danpianji/"
    ##结果报错
    # /bin/sh: NAME: This variable is read only.
    

    删除变量

    unset variable_name
    # eg :
    #!/bin/sh
    myUrl="http://c.biancheng.net/shell/"
    unset myUrl
    echo $myUrl
    ##结果无输出
    

    作用域

    #!/bin/bash
    #定义函数
    function func(){
        local a=99  #局部变量
        b = 100    #全局变量
    }
    #调用函数
    func
    #输出函数内部的变量
    echo $a
    echo $b
    
    #临时的环境变量
    #关闭回话就销毁
    export a=100
    

    Shell位置参数(命令行参数)

    定义 Shell 函数时不能带参数,但是在调用函数时却可以传递参数,这些传递进来的参数,在函数内部就也使用$n的形式接收,例如,1 表示第一个参数,2 表示第二个参数,依次类推

    1)给脚本文件传递位置参数

    test.sh

    #!/bin/bash
    echo "Language: $1"
    echo "URL: $2"
    

    运行脚本

     . ./test.sh Shell http://c.biancheng.net/shell/
     ##输出结果
     #Language: Shell
     #URL: http://c.biancheng.net/shell/
    

    2)给函数传递位置参数

    test.sh

    #!/bin/bash
    #定义函数
    function func(){
        echo "Language: $1"
        echo "URL: $2"
    }
    #调用函数
    func Shell http://c.biancheng.net/shell/
    

    运行脚本

    $ . ./test.sh
     ##输出结果
     #Language: Shell
     #URL: http://c.biancheng.net/shell/
    

    Shell特殊变量

    变量 含义
    $0 当前脚本的文件名。
    $n(n≥1) 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 1,第二个参数是2。
    $# 传递给脚本或函数的参数个数。
    $* 传递给脚本或函数的所有参数。
    $@ 传递给脚本或函数的所有参数。当被双引号" "包含时,@ 与* 稍有不同,我们将在《Shell *和@的区别》一节中详细讲解。
    $? 上个命令的退出状态,或函数的返回值,我们将在《Shell $?》一节中详细讲解。
    $$ 当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。

    传递参数(脚本,函数传递一样)

    #!/bin/bash
    #定义脚本文件:test.sh
    echo "Process ID: $$"
    echo "File Name: $0"
    echo "First Parameter : $1"
    echo "Second Parameter : $2"
    echo "All parameters 1: $@"
    echo "All parameters 2: $*"
    echo "Total: $#"
    
    #运行脚本
    $ chmod +x ./a.sh
    $ ./test.sh Shell Linux
    ##运行结果
    #Process ID: 2788
    #File Name: ./test.sh
    #First Parameter : Shell
    #Second Parameter : Linux
    #All parameters 1: Shell Linux
    #All parameters 2: Shell Linux
    #Total: 2
    

    Shell $*和$@的区别

    1. $* 和 $@ 不被双引号" "包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据
    2. 被双引号" "包含时:
      • "$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。
      • "$@"仍然将每个参数都看作一份数据,彼此之间是独立的。

    Shell $?

    获取函数返回值或者上一个命令的退出状态

    Shell命令替换:将命名的输出结果赋值给变量

    Shell 命令替换是指将命令的输出结果作为值赋给某个变量。比如,在某个目录中输入 ls 命令可查看当前目录中所有的文件,但如何将输出内容存入某个变量中呢?这就需要使用命令替换了,这也是 Shell 编程中使用非常频繁的功能。

    被替换的命令的输出内容包括多行(也即有换行符),或者含有多个连续的空白符,那么在输出变量时应该将变量用双引号包围,否则系统会使用默认的空白符来填充,这会导致换行无效,以及连续的空白符被压缩成一个。

    请看下面的代码:

    #!/bin/bash
    LSL=`ls -l`
    echo $LSL  #不使用双引号包围
    echo "--------------------------"  #输出分隔符
    echo "$LSL"  #使用引号包围
    
    #运行结果
    total 8 drwxr-xr-x. 2 root root 21 7月 1 2016 abc -rw-rw-r--. 1 mozhiyan mozhiyan 147 10月 31 10:29 demo.sh -rw-rw-r--. 1 mozhiyan mozhiyan 35 10月 31 10:20 demo.sh~
    --------------------------
    total 8
    drwxr-xr-x. 2 root     root      21 7月   1 2016 abc
    -rw-rw-r--. 1 mozhiyan mozhiyan 147 10月 31 10:29 demo.sh
    -rw-rw-r--. 1 mozhiyan mozhiyan  35 10月 31 10:20 demo.sh~
    

    字符串

    获取字符串长度

    #!/bin/bash
    
    str="http://c.biancheng.net/shell/"
    echo ${#str}
    运行结果:
    29
    

    字符串拼接

    #!/bin/bash
    
    name="Shell"
    url="http://c.biancheng.net/shell/"
    
    str1=$name$url  #中间不能有空格
    str2="$name $url"  #如果被双引号包围,那么中间可以有空格
    str3=$name": "$url  #中间可以出现别的字符串
    str4="$name: $url"  #这样写也可以
    str5="${name}Script: ${url}index.html"  #这个时候需要给变量名加上大括号
    
    echo $str1
    echo $str2
    echo $str3
    echo $str4
    echo $str5
    运行结果:
    Shellhttp://c.biancheng.net/shell/
    Shell http://c.biancheng.net/shell/
    Shell: http://c.biancheng.net/shell/
    Shell: http://c.biancheng.net/shell/
    ShellScript: http://c.biancheng.net/shell/index.html
    

    字符串截取

    ${string: start :length} 从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
    ${string: start} 从 string 字符串的左边第 start 个字符开始截取,直到最后。
    ${string: 0-start :length} 从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
    ${string: 0-start} 从 string 字符串的右边第 start 个字符开始截取,直到最后。
    ${string#*chars} 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
    ${string##*chars} 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
    ${string%*chars} 从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
    ${string%%*chars} 从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。

    ${string: start :length} 从左边数

    # 
    url="c.biancheng.net"
    echo ${url: 2: 9}
    结果为biancheng
    

    ${string: 0-start :length}从右边数

    url="c.biancheng.net"
    echo ${url: 0-13: 9}
    结果为biancheng。从右边数,b是第 13 个字符。
    echo ${url: 0-13}  #省略 length,直接截取到字符串末尾
    结果为biancheng.net
    

    数组

    #定义数组
    array_name=(ele1  ele2  ele3 ... elen)
    #获取数组元素
    ${array_name[index]}
    #获取数组长度,一下两者都可以
    ${#array_name[@]}  
    ${#array_name[*]}
    #删除元素
    unset array_name[index]   #删除单个元素
    unset array_name   #删除整个数组
    #数组拼接
    array_new=(${array1[@]}  ${array2[@]})
    array_new=(${array1[*]}  ${array2[*]})
    

    Shell内建命令(内置命令)

    由 Bash 自身提供的命令,而不是文件系统中的某个可执行文件。

    使用 type 来确定一个命令是否是内建命令:

    [root@localhost ~]# type cd
    cd is a Shell builtin
    [root@localhost ~]# type ifconfig
    ifconfig is /sbin/ifconfig
    

    alias

    alias 用来给命令创建一个别名

    #查看所有已创建的别名
    [root@localhost ~]# alias
    alias cp='cp -i'
    alias l.='ls -d .* --color=tty'
    alias ll='ls -l --color=tty'
    alias ls='ls --color=tty'
    alias mv='mv -i'
    alias rm='rm -i'
    alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
    
    #创建别名
    alias myShutdown='shutdown -h now'
    

    这样定义别名只能在当前 Shell 环境中有效,换句话说,重新登录后这个别名就消失了。为了确保永远生效,可以将该别名手动写入到用户主目录中的.bashrc文件。

    .bashrc其实也是一个 Shell 脚本文件,该文件专门用来存放用户自定义的别名和函数。

    # .bashrc
    # User specific aliases and functions
    alias myShutdown='shutdown -h now'
    
    # Source global definitions
    if [ -f /etc/bashrc ]; then
        . /etc/bashrc
    fi
    

    unalias 内建命令可以删除当前 Shell 环境中的别名

    #删除 ll 别名
    unalias ll
    #删除所有的别名
    unalias -a
    

    echo

    用来在终端输出字符串,并在最后默认加上换行符。

    exit

    • 如果在终端中直接运行 exit 命令,会退出当前登录的 Shell,并关闭终端;
    • 如果在 Shell 脚本中出现 exit 命令,会停止执行后边的所有代码,立即退出 Shell 脚本。

    ulimilt

    使用 ulimit 命令可以控制进程对可用资源的访问

    数学运算

    算术运算符 说明/含义
    +、- 加法(或正号)、减法(或负号)
    *、/、% 乘法、除法、取余(取模)
    ** 幂运算
    ++、-- 自增和自减,可以放在变量的前面也可以放在变量的后面
    !、&&、|| 逻辑非(取反)、逻辑与(and)、逻辑或(or)
    <、<=、>、>= 比较符号(小于、小于等于、大于、大于等于)
    ==、!=、= 比较符号(相等、不相等;对于字符串,= 也可以表示相当于)
    <<、>> 向左移位、向右移位
    ~、|、 &、^ 按位取反、按位或、按位与、按位异或
    =、+=、-=、*=、/=、%= 赋值运算符,例如 a+=1 相当于 a=a+1,a-=1 相当于 a=a-1

    (()):对整数进行数学运算

    双小括号 (( )) 是 Bash Shell 中专门用来进行整数运算的命令,它的效率很高,写法灵活,是企业运维中常用的运算命令。

    let命令:对整数进行数学运算

    let 命令和双小括号 (( )) 的用法是类似的,它们都是用来对整数进行运算

    [c.biancheng.net]$ a=10 b=35
    [c.biancheng.net]$ let a+=6 c=a+b  #多个表达式以空格为分隔
    [c.biancheng.net]$ echo $a $c
    16 51
    [c.biancheng.net]$ echo let a+b  #错误,echo会把 let a+b作为一个字符串输出
    let a+b
    

    相关文章

      网友评论

          本文标题:shell 脚本语言

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