zoukankan      html  css  js  c++  java
  • Shell 脚本学习 — 基本元素

    1 变量

    Shell 变量名称的开头是一个字母或下划线符号,后面可以接着任意长度的字母、数字或下划线符号。

    Shell 变量名称的字符长度并无限制

    Shell 变量可以用来保存字符串值,所能保存的字符数同样没有限制。

    变量的赋值方式为:先写变量名称,紧接着 = 字符,最后是新值,中间完全没有任何空格。当你想取出 Shell 变量的值时,需于变量名称前面加 $ 字符。当所赋予的值内含空格时,请加上引号:

    first=isaac middle=bashevis last=singer   #单行可进行多次赋值
    fullname="isaac bashevis singer"          #值中包含空格时使用引号
    oldname=$fullname                         #此处不需要引号

    不过,当你将几个变量连接起来时,就需要使用引号了:

    fullname="$first $middle $last"           #这里需要双引号

     

    2 简单的 echo 输出

    $ echo Now is the time for all good men
    Now is the time for all good men

     

    3 华丽的 printf 输出

    printf 命令模仿 C 程序库里的 printf() 程序。它几乎复制了该函数所有的功能,如果你曾使用C、C++、awk、Perl、Python 或 Tcl 写过程序,对它的基本概念应该不陌生。当然,它在 Shell 层级的版本上,会有些差异。

    如同 echo 命令, printf 命令可以输出简单的字符串:

    printf "hello, world\n"

    printf 不像 echo 那样会自动提供一个换行符号。你必须显示地将换行符号指定成 \n 。printf 命令的完整语法分为两部分:

    printf format-string [arguments ...]

    第一部分(format-string)是一个字符串,用来描述输出的排列方式,最好为此字符串加上引号。此字符串包含了按字面显示的字符以及格式声明,后者是特殊的占位符,用来描述如何显示相应的参数。格式声明分成两部分:百分比符号(%)和指示符。最常用的格式指示符有两个,%s 用于字符串,而 %d 用于十进制整数。

    第二部分(arguments ...)是与格式声明想对应的参数列表。

    格式字符串中,一般字符会按字面显示,转义序列则解释后再输出成相应的字符。格式什么以 % 符号开头,并以定义的字母集中的一个字符来结束,用来控制相应参数的输出。例如,%s 用户字符串的输出:

    $ printf "The first program always prints '%s, %s!'\n" Hello world
    The first program always prints 'Hello world!'

    4 基本的 I/O 重定向

    4.1 重定向与管道

    Shell 提供了数种语法标记,可以用来改变默认 I/O 的来源端与目的端。

    * 以 < 改变标准输入

    program < file 可将 program 的标准输入修改为 file:

    tr -d '\r' < dos-file.txt

     * 以 > 改变标准输出

    program > file  可将 program 的标准输出修改为 file:

    tr -d '\r' < dos-file.txt > UNIX-file.txt

     这条命令会先以 tr 将 dos-file.txt 里的 ASCII 回车删除,再将转换完成的数据输出到 UNIX-file.txt。(dos-file.txt 里的原始数据不会有变化)。

    > 重定向符在目的文件不存在时,会新建一个。然而,如果目的文件已存在,它就会被覆盖掉;原本的数据都会丢失。

    * 以 >> 附加到文件

    program >> file 可将 program 的标准输出附加到 file 的结尾处。

    如同 >,如果目的文件不存在,>>重定向符便会新建一个。然而,如果目的文件存在,它不会直接覆盖掉文件,而是将程序所产生的数据附加到文件结尾处:

    for f in dos-file*.txt
    do
        tr -d '\r' < $f >> big-UNIX-file.txt
    done

    * 以 | 建立管道

     program1 | program2  可将 program1 的标准输出修改为 program2 的标准输入。

    tr -d '\r' < dos-file.txt | sort > UNIX-file.txt

    tr 命令详解

    语法

    tr [ options ] source-char-list replace-char-list

    用途

      转换字符。例如,将大写字符转换成小写。选项可让你指定要删除的字符,以及将一串重复出现的字符浓缩成一个。

    常用选项

    - c

      取 source-char-list 的反义。tr 要转换的字符,变成未列在 source-char-list 中的字符。此选项通常与  -d 或 -s 配合使用。

    - C

      与 -c 相似,但所处理的是字符(可能是包含多个字节的宽字符),而非二进制的字节值。

    -d

      自标准输入删除 source-char-list 里所列的字符,而不是转换它们。

    -s

      浓缩重复的字符。如果标准输入中连续重复出现 source-char-list 里的所列的字符,则将其浓缩成一个。

    行为模式

      如同过滤器:自标准输入读取字符,再将结果写到标准输出。任何输入字符只要出现在 source-char-list 中,就会置换成 replace-char-list 里相应的字符。POSIX 风格的字符与等效的字符集也适用,而且 tr 还支持 replace-char-list 中重复字符的标记法。

    警告

      根据 POSIX 标准的定义,-c 处理的是二进制字节值,而 -C 处理的是现行 locale 所定义的字符。

    4.2  特殊文件:/dev/null 与 /dev/tty

    UNIX 系统提供了两个对 Shell 编程特别有用的特殊文件。第一个文件 /dev/null,就是大家所熟知的位桶(bit bucket)。传说到此文件的数据都会被系统丢掉。也就是说,当程序将数据写到此文件时,会认为它已经成功完成写入数据的操作,但实际上什么事都没做。如果你需要的是命令的退出状态,而非它的输出,次功能会很有用。例如,测试一个文件是否包含某个模式:

    if grep patten myfile > /dev/null
    then
        ...      #找到模式时
    else
        ...      #找不到模式时
    fi

     相对地,读取 /dev/null 则会立即返回文件结束符号。读取 /dev/null 的操作很少会出现在 Shell 程序里,不过了解这个文件的行为模式还是非常重要的。

     另一个特殊文件为 /dev/tty 。当程序打开此文件时,UNIX 会自动将它重定向到一个终端 [ 一个实体的控制台或串行端口,也可能是一个通过网络与窗口登录的伪终端 ] 再也程序结合。这在程序必须读取人工输入时(例如密码)特别有用。此外,用它来产生错误信息也很方便,只是比较少人这么做:

    printf "Enter new password: "   #提示输入
    stty -echo                      #关闭自动打印输入字符的功能
    read pass < /dev/tty            #读取密码
    printf "Enter again: "          #提示再输入一次
    read pass2 < /dev/tty           #再读取一次以确认
    stty echo                       #别忘了打开自动打印输入字符的功能
    #...

    stty 命令用来控制终端的各种设置。 -echo 选项用来关闭自动打印每个输入字符的功能;stty echo 用来恢复该功能。

    参考:<<Shell 脚本学习指南>>

  • 相关阅读:
    springboot读取配置文件中的集合对象
    springboot使用log4j2代替内置log4j
    springboot默认日志logback配置解析
    centos7.6源码离线安装msyql 5.7.30
    使用wget下载出现Unable to establish SSL connection问题的解决方案
    在RAC上部署OGG并配置OGG高可用
    writeset参数配置探索——究竟在哪个角色上配置参数?
    proxySQL with SemiSync
    proxySQL with MGR
    主从复制直接转换MGR_5.7验证试验
  • 原文地址:https://www.cnblogs.com/bruceleeliya/p/2489868.html
Copyright © 2011-2022 走看看