精华内容
下载资源
问答
  • shell脚本入门

    2021-04-15 15:48:46
    一、什么是shell脚本 我们已经能够熟练的在终端中输入命令来完成一些常用的软件,但是我们一条一条输入命令。这样会很麻烦,那么有没有一种方式可以将很多条命令放到一个文件夹里面,然后直接运行这个文件即可?肯定...

    一、什么是shell脚本
    我们已经能够熟练的在终端中输入命令来完成一些常用的软件,但是我们一条一条输入命令。这样会很麻烦,那么有没有一种方式可以将很多条命令放到一个文件夹里面,然后直接运行这个文件即可?肯定有,这个就是Shell脚本。
    Shell脚本类似于windows的批处理文件,shell脚本就是将连续执行的命令写成一个文件。
    Shell脚本提供数组、循环、条件判断的等功能。Shell脚本一般是Linux运维或者系统管理员要掌握的,作为嵌入式开发人员,只需要掌握shell脚本最基础的部分即可。
    二、shell脚本写法
    shell脚本是个纯文本文件,命令从上而下,一行一行开始执行。Shell脚本扩展名叫做.sh。shell脚本第一行一定为:
    #!/bin/bash
    表示使用bash

    三、shell脚本语法
    3.1第一个shell脚本
    我们可以创建一个shell脚本文件:
    在这里插入图片描述
    我们对my.sh文件进行编辑:

    在这里插入图片描述编辑完之后修改可执行权限,通过数字修改为“777”:
    在这里插入图片描述
    注:
    我已经修改完了权限,所以查看还是“777”。

    执行该文件:
    在这里插入图片描述
    3.2交互式shell脚本
    推荐书籍《鸟哥的Linux私房菜》。详细学习的情况下买。
    Linux read命令用于从标准输入读取数值。read 内部命令被用来从标准输入读取单行数据。这个命令可以用来读取键盘输入,当使用重定向的时候,可以读取文件中的一行数据。
    先写个简单的有关read命令脚本:
    我们直接修改前面创建的my.sh的内容:
    在这里插入图片描述
    运行详情:
    在这里插入图片描述
    (手贱,name打错了QAQ)
    read --p 后面跟提示信息,即在输入前打印提示信息。
    我们再次修改my.sh命令脚本:
    在这里插入图片描述
    运行结果:
    在这里插入图片描述
    3.3 Shell脚本的数值计算
    Shell仅支持整型,数值计算使用$(表达式)。
    范例代码块:
    在这里插入图片描述
    运行结果:
    在这里插入图片描述
    3.4 test命令
    test命令用于查看文件是否存在、权限等信息,可以进行数值、字符、文件三方面的测试。

    $$和||命令:

    cmd1 $$ cmd2 当cmd2执行完毕写正确,那么cmd2开始执行,如果cmd1执行完毕错误,那么cmd2不执行。
    cmd1 || cmd2 当cmd1下执行完毕并正确,那么cmd2不执行,反之cmd2执行。

    test查看文件是否存在(test -e 如果文件存在则为真):
    代码实例:
    在这里插入图片描述
    运行样例:
    在这里插入图片描述
    test查看字符串相等(字符串相等为真):
    代码实例:
    在这里插入图片描述
    运行结果:在这里插入图片描述
    3.5 中括号[]判断符
    [ ]中只能输入“==”或“!=”
    [ ]离中括号左右两边一定要有空格空开,对于字符串一定要有””双引号。

    代码样例:在这里插入图片描述
    运行结果:在这里插入图片描述
    3.6 默认变量
    0 0~n,表示shell脚本的参数,包括shell脚本本身,shell命令本身为$0
    $#:#表示最后一个参数的标号
    $@:表$1,$2,$3…
    代码样例:在这里插入图片描述
    运行结果:在这里插入图片描述

    展开全文
  • Korn Shell 脚本入门

    千次阅读 2013-09-30 11:22:42
    Korn Shell 脚本入门 所有的 UNIX® 用户都应该了解如何使用 Korn Shell 脚本。通过编写 Shell 脚本,可以让您实现许多任务的自动化,并可以为您节约大量的时间。初看起来,它似乎令人生畏,但只要遵循正确...

    Korn Shell 脚本入门

    所有的 UNIX® 用户都应该了解如何使用 Korn Shell 脚本。通过编写 Shell 脚本,可以让您实现许多任务的自动化,并可以为您节约大量的时间。初看起来,它似乎令人生畏,但只要遵循正确的指导,您就可以熟练地使用它。本文将指导您编写自己的 Korn Shell 脚本。

    Kurt A. Riley, IT 顾问

    2008 年 8 月 18 日

    • +内容

    什么是 Shell?

    IBM® AIX® 操作系统和其他的类 UNIX 操作系统一样,都需要通过某种方式与内核进行通信。这项任务正是通过使用 Shell 来实现的。您可以使用各种不同的 Shell,但本文重点关注于 Korn Shell。Korn Shell 是 AIX 所使用的缺省 Shell。

    当您登录到 AIX 中时,将以某个目录的提示符作为开始。缺省目录通常是您的 home 目录。之所以将其称为 home 目录,是因为该目录的结构通常如下所示:

    $/home/jthomas:

    当登录时,您将处于命令行或者命令提示符处。这正是您输入 UNIX 命令的地方。您可以输入与 UNIX 内核进行交互的 Shell 命令。这些命令可能简单到只有一行(比如查看日期),也可能为多行,而这取决于您所进行的操作。清单 1 提供了一些示例命令。

    清单 1. 示例命令
    $date
    Fri May  1 22:59:28 EDT 2008
    $uptime
    10:59PM   up 259 days,   9:44,  5 users,  load average: 3.81, 14.27, 13.71
    $hostname
    gonzo

    有关 Shell 命令的最棒的一项功能是,您可以将多个命令组合在一个称为脚本的文件中,它允许您依次运行多个命令。当您必须一次又一次重复地运行相同的命令时,使用脚本非常合适。您可以将这些命令放到一个 Korn Shell 脚本中,而无需反复地键入这些命令。

    编写您的第一个 Korn Shell 脚本

    Korn Shell 脚本中的第一行是 Shell 自身。它被表示为下面的形式:

    #!/bin/ksh

    要在 AIX 中编写 Korn Shell 脚本,您需要使用一种文本编辑器。vi 是一种使用最广泛、且随处可见的文本编辑器。开始接触时可能会觉得有点麻烦,但随着使用 vi 的次数的增多,您将熟练地掌握它。关于如何使用 vi 文本编辑器,人们撰写了很多相关的书籍。

    要开始编写您的第一个 Korn Shell 脚本,首先需要打开 vi 编辑器,并添加 Shell 名称作为第一行。完成这项操作之后,您需要构建某种类型的脚本标头,用来告诉编写脚本的用户,该脚本将执行什么操作,以及该脚本的编写时间。您可以对脚本进行任意地命名,但通常使用扩展名 .ksh 来表示 Korn Shell 脚本。您并不是必须要这样做,但这是一种很好的做法。镑符号 (#) 可用于对脚本进行注释,如清单 2 中所示。

    清单 2. 脚本标头的示例
    $vi my_first_script.ksh
    #!/bin/ksh
    ###################################################
    # Written By: Jason Thomas
    # Purpose: This script was written to show users how to develop their first script
    # May 1, 2008
    ###################################################

    这个脚本标头非常简单,但它应用了上述的技巧。

    变量

    在脚本中设置变量是相当简单的。我通常使用大写形式来表示脚本内的所有变量,如清单 3 所示,但您不需要这样做。

    清单 3. 变量的示例
    #Define Variables
    HOME="/home/jthomas" #Simple home directory 
    DATE=$(date) # Set DATE equal to the output of running the shell command date
    HOSTNAME=$(hostname) # Set HOSTNAME equal to the output of the hostname command
    PASSWORD_FILE="/etc/passwd" # Set AIX password file path

    Korn Shell 的具体细节

    到目前为止,作为编写 Korn Shell 脚本的入门内容,您已经了解了如何编写基本的脚本标头,以及定义变量。现在,您可以开始编写一些 Korn Shell 代码了。

    让我们开始从某个文件中读取一些行。在这个示例中,使用您已经在脚本中定义过的 /etc/passwd 文件,并且仅打印用户名称,如清单 4 中所示。

    清单 4. for 循环
    $vi my_first_script.ksh
    #!/bin/ksh
    ###################################################
    # Written By: Jason Thomas
    # Purpose: This script was written to show users how to develop their first script
    # May 1, 2008
    ###################################################
    
    #Define Variables
    HOME="/home/jthomas" #Simple home directory 
    DATE=$(date) # Set DATE equal to the output of running the shell command date
    HOSTNAME=$(hostname) # Set HOSTNAME equal to the output of the hostname command
    PASSWORD_FILE="/etc/passwd" # Set AIX password file path
    
    #Begin Code
    
    for username in $(cat $PASSWORD_FILE | cut -f1 -d:)
    do
    
           print $username
    
    done

    这种语法形式被称为 for 循环。它允许您打开 /etc/passwd 文件,并且每次读取其中的一行内容,仅截取文件中的第一个字段,然后打印这行内容。请注意这个特殊字符:|。我们称其为管道。管道允许您将一个命令的输出重定向到另一个命令。

    在保存该脚本之后,您可以运行它,如清单 5 中所示。

    清单 5. 运行脚本
    $./my_first_script.ksh
    root
    daemon
    bin
    sys
    adm
    uucp
    nobody
    lpd

    该脚本开始将输出打印到屏幕上。或者,您可以通过进行下面的操作仅将输出打印到一个文件中:

    print $username >> /tmp/usernames

    >> 告诉打印命令仅将每个用户名依次追加到一个文件中。通过进行这项操作,在您的终端中将不会再显示相应的文本。您还可以通过使用下面的命令,将输出同时打印到屏幕和文件中:

    print $username | tee –a /tmp/usernames

    tee 命令允许您同时将输出重定向到终端和文件。

    您刚刚了解了如何使用 for 循环读取文件的内容,以及如何仅截取用户名、并将输出重定向到文件或者终端。

    错误检查

    如果开始的时候 /etc/passwd 文件并不存在,那么会发生什么情况呢?简单来说,该脚本将会失败。清单 6 显示了用来检查该文件是否存在的语法。

    清单 6. 用来检查某文件是否存在的语法
    #Begin Code
    if [[ -e $PASSWORD_FILE ]]; then #Check to see if the file exists and if so then continue
    
         for username in $(cat $PASSWORD_FILE | cut -f1 -d:)
         do
    
             print $username
    
         done
    else
      
             print "$PASSWORD_FILE was not found"
             exit
    fi

    这一小段代码显示了条件型 if 语句。如果 /etc/passwd 文件存在,那么该脚本将继续执行。如果这个文件不存在,那么该脚本将在终端屏幕上打印 "/etc/passwd file was not found",然后退出。条件型 if 语句以 if 开头,以反写的字母 (fi) 结尾。

    美元问号符 ($?)

    每当您在 AIX 中运行一个命令时,系统将设置一个变量,它通常被称为美元问号符。AIX 将这个变量设置为零,以表示成功;设置为非零,以表示失败。这对于 Korn Shell 脚本来说是非常有用的。清单 7 介绍了当您运行有效和无效的 AIX 命令时查看 $? 变量的设置。

    清单 7. 针对有效和无效 AIX 命令,如何设置 $?
    $date  
    Sat May 10 00:02:31 EDT 2008
    $echo $?
    0
    $uptime
      12:02AM   up 259 days,  10:47,  5 users,  load average: 4.71, 10.44, 12.62
    $echo $?
    0
    $IBM
    ksh: IBM:  not found.
    $echo $?
    127
    $aix
    ksh: aix:  not found.
    $echo $?
    127
    $ls -l /etc/password
    ls: 0653-341 The file /etc/password does not exist.
    $echo $?
    2

    在编写 Korn Shell 脚本时,这是非常有价值的,因为它向您提供了另一种检查错误的方式。下面是用于检查 /etc/passwd 文件是否存在的另一种不同的方式:

    #Begin Code
    PASSWORD_FILE="/etc/passwd"
    
    ls –l $PASSWORD_FILE > /dev/null 2>&1

    这个命令允许您列出该文件。然而,您并不是真的在意这个文件是否存在。对于您来说,重要的是获得该命令的返回代码。大于符号 > 允许您对该命令的输出进行重定向。在本文稍后的内容中,您将了解更多有关重定向输出的信息。

    清单 8 显示了如何在脚本中使用 $?

    清单 8. 在脚本中使用 $?
    #Begin Code
    PASSWORD_FILE="/etc/passwd"
    
    ls –l $PASSWORD_FILE > /dev/null 2>&1 
    if [[ $? != 0 ]]; then
    
           print “$PASSWORD_FILE was not found"
           exit
    
    else
       
       for username in $(cat $PASSWORD_FILE | cut -f1 -d:)
       do
    
           print $username
    
       done          
    fi

    我尝试了列出该文件,而不是实际地进行检查,以判断该文件是否存在。如果您可以列出该文件,则表示该文件存在。如果您无法列出该文件,则表示该文件不存在。在 AIX 中可以通过使用 ls ¨Cl filename 命令列出文件。这项操作使得您可以通过检查 $? 变量来测试 AIX 命令是否成功执行。

    标准输入、输出和错误

    您真的需要了解这些内容。一般说来,主要存在三个输入和输出源。在 AIX 中,它们分别称为 STDINSTDOUT 和 STDERRSTDIN 指的是您可能从键盘获得的输入。STDOUT 是执行一个命令时打印到屏幕上的输出。STDERR 则对应于一个命令失败时的屏幕输出。STDINSTDOUT 和STDERR 的文件描述符分别映射到数值 0、1 和 2。

    如果希望检查一个命令成功或者失败,那么您可以进行类似清单 9 中的操作。

    清单 9. 将输出重定向到 STDOUT 和 STDERR
    $date > /dev/null 2&&1  # Any output from this command should never be seen
    
    if [[ $? = 0 ]]; then
          print "The date command was successful"
    else
          print "The date command failed
    fi

    这段代码运行了 AIX 中的 date 命令。您应该不会看到任何来自 STDOUT(文件描述符 1)或者 STDERR(文件描述符 2)的输出。然后,您使用条件型 if 语句,以检查该命令的返回代码。如前所述,如果该命令返回零,那么该命令的执行是成功的;如果它返回的是非零,那么它的执行是失败的。

    函数

    在 Korn Shell 脚本中,单词 function 是一个保留字。可以使用函数将脚本划分为多个部分。在您调用函数时,仅运行相应的片断。在已编写的代码的基础上,创建一个错误检查函数,如清单 10 所示。

    清单 10. 错误检查函数
    ##################
    function if_error
    ##################
    {
    if [[ $? -ne 0 ]]; then # check return code passed to function
        print "$1" # if rc > 0 then print error msg and quit
    exit $?
    fi
    }

    如果我希望在脚本中运行一个简单命令,那么我可以简单地编写一些类似于上面 $? 的错误检查代码。每当我希望检查某些操作是否失败时,我还可以仅调用 if_error 函数,如清单 11 所示。

    清单 11. 调用 if_error 函数
    rm –rf /tmp/file #Delete file
    if_error "Error: Failed removing file /tmp/file"
    
    mkdir /tmp/test #Create the directory test
    if_error "Error: Failed trying to create directory /tmp/test"

    每当运行上面的任何一个命令时,就会调用一次 if_error 函数。对应于该特定错误检查的消息将传递给 if_error 函数。这一点很重要,因为它允许您编写一次 Shell 脚本代码,却可以一次又一次地使用它。这样可以更快、更简单地编写 Shell 脚本。

    case 语句

    case 语句是另一种条件型语句,您可以用该语句来替代 if 语句。case 语句以 case 开头,并且以反写的 (esac) 结尾。当您的脚本变得比较复杂、并且需要执行不同的任务时,可以使用 case 语句迅速地进行构建。清单 12 提供了一个示例。

    清单 12. case 语句
    case value in 
    "Mypattern") commands to execute 
     when value matches 
     Mypattern 
     ;; 
    esac

    假设您希望在某天中不同的时刻删除一个文件。那么您可以创建一个变量,用于检查具体的时刻:

    TIME=$(date +%H%M)

    清单 13 中所显示的代码将在晚上 10:00 和晚上 11:00 删除某个文件。因此,每次执行这个代码段的时候,将检查 $TIME 是否匹配 case 语句所指定的时间。如果匹配,那么将执行相应的代码。

    清单 13. 用于检查时间的 case 语句
    case $TIME in
                     "2200") #This means 10:00
                      rm –rf /tmp/file1
                            ;;
                      "2300")#This means 11:00
                      rm –rf /tmp/file1
                            ;;
                        "*")
                            echo "Do nothing" > /dev/null
                            ;;
    
     esac

    综合使用完整的脚本

    到目前为止,您已经创建了一个脚本标头和一些简单变量,并且添加了一个函数,如清单 14 所示。

    清单 14. 示例 Korn shell 脚本
    $vi my_second_script.ksh
    #!/bin/ksh
    ###################################################
    # Written By: Jason Thomas
    # Purpose: This script was written to show users how to develop their first script
    # May 1, 2008
    ###################################################
    
    #Define Variables
    HOME="/home/jthomas" #Simple home directory 
    TIME=$(date +%H%M) # Set DATE equal to the output of running the shell command date
    HOSTNAME=$(hostname) # Set HOSTNAME equal to the output of the hostname command
    
    
    ##################
    function if_error
    ##################
    {
    if [[ $? -ne 0 ]]; then # check return code passed to function
        print "$1" # if rc > 0 then print error msg and quit
    exit $?
    fi
    }
    
    if [[ -e /tmp/file ]]; then  #Check to see if the file exists first
       rm –rf /tmp/file #Delete file
       if_error "Error: Failed removing file /tmp/file"
    else
       print "/tmp/file doesn’t exist"
    fi
    
    if [[ -e /tmp/test ]]; then
         mkdir /tmp/test #Create the directory test
         if_error "Error: Failed trying to create directory /tmp/test"
    else
         print "Directory exists, no need to create directory"
    fi
    
    case $TIME in
                     "2200")
                      rm –rf /tmp/file1
                            ;;
                      "2300")
                      rm –rf /tmp/file1
                            ;;
    #End Script

    要运行这个脚本,您只需要键入 ./scriptname.ksh,如下所示:

    $./my_second_script.ksh

    在命令行中将输入传递给某个脚本

    您可以创建相应的脚本,以允许将输入传递到其中。请参见清单 15

    清单 15. 将输入传递到脚本中
    #!/bin/ksh
    
    OPTION=$1
    
    print "I love $OPTION"
    
    $./scriptname milk
    I love milk
    $./scriptname tea
    I love tea
    $./scriptname "peanut butter"
    I love peanut butter

    任何时候将信息传递到脚本中时,在脚本名之后的第一个选项称为 $1。在脚本名之后的第二个选项称为 $2,以此类推。这种编写脚本的方式非常好,因为这样一来,它更像是带有一些开关或者选项的 UNIX 命令。

    在脚本中发送电子邮件

    您可以使用脚本来生成某些类型的报告。例如,可能编写了某个脚本来对每天添加到系统中的新用户进行跟踪。这个脚本可以将输出写入到某个文件中,然后您可以将该文件发送给自己。通过这种方式,您可以获得每天添加到系统中的所有新用户的统计信息的副本。要实现这一点,可以运行下面的命令:

    $REPORT="/tmp/users"
    
    cat $REPORT | mailx –s "User admin report from server XYZ" Jason_Thomas@kitzune

    这项操作将向您发送一封 $REPORT 文件内容的电子邮件。-s 将作为该电子邮件的主题。这项功能使用起来的确非常方便。

    结束语

    Korn Shell 脚本可以为您节约大量的时间,并使您的工作更加轻松。初看起来,它似乎令人生畏,但请记住,应该始终从简单之处入手,分别构建相应的脚本。请始终遵循同样的步骤:构建您的脚本标头,定义变量,然后对您的工作进行错误检查。您可能会发现,您希望为所进行的每项工作编写脚本

    展开全文
  • perl 、shell、python之shell脚本入门

    万次阅读 2014-07-23 15:35:54
    终于到shell 脚本这章了,在以前笔者卖了好多关子说shell脚本怎么怎么重要,确实shell脚本在linux系统管理员的运维工作中非常非常重要。下面笔者就带你正式进入shell脚本的世界吧。 到现在为止,你明白什么是shell...

    shell是操作linux的基本,是必须学的。学shell就是学linux命令。
    perl有强大的正则表达式支持,对于文本处理非常强悍,玩linux不得不学。
    python作用一种面向对象的,能作为linux脚本的语言,学好之后能帮你很好地完成工作。
    
    
    
    shell翻译成壳的意思,它是包裹在linux内核外层的,一个可通过一系列的linux命令对操作系统发出相关指令的人机界面。 shell可以通过其条件语句和循环语句等,把一系列linux命令结合在一起,形成一个相当于面向过程的程序,shell script,来实现一些较为复杂的功能。
    总括,shell是linux命令集的概称,是属于命令行的人机界面
    
    

    shell脚本在linux系统管理员的运维工作中非常非常重要下面笔者就带你正式进入shell脚本的世界吧

    到现在为止,你明白什么是shell脚本吗?如果明白最好了,不明白也没有关系,相信随着学习的深入你就会越来越了解到底什么是shell脚本首先它是一个脚本,并不能作为正式的编程语言因为是跑在linuxshell中,所以叫shell脚本说白了,shell脚本就是一些命令的集合举个例子,我想实现这样的操作:1)进入到/tmp/目录;2)列出当前目录中所有的文件名;3)把所有当前的文件拷贝到/root/目录下;4)删除当前目录下所有的文件简单的4步在shell窗口中需要你敲4次命令,按4次回车这样是不是很麻烦?当然这4步操作非常简单,如果是更加复杂的命令设置需要几十次操作呢?那样的话一次一次敲键盘会很麻烦所以不妨把所有的操作都记录到一个文档中,然后去调用文档中的命令,这样一步操作就可以完成其实这个文档呢就是shell脚本了,只是这个shell脚本有它特殊的格式

    Shell脚本能帮助我们很方便的去管理服务器,因为我们可以指定一个任务计划定时去执行某一个shell脚本实现我们想要需求这对于linux系统管理员来说是一件非常值得自豪的事情现在的139邮箱很好用,发邮件的同时还可以发一条邮件通知的短信给用户,利用这点,我们就可以在我们的linux服务器上部署监控的shell脚本,比如网卡流量有异常了或者服务器web服务器停止了就可以发一封邮件给管理员,同时发送给管理员一个报警短信这样可以让我们及时的知道服务器出问题了

    有一个问题需要约定一下,凡是自定义的脚本建议放到/usr/local/sbin/目录下,这样做的目的是,一来可以更好的管理文档;二来以后接管你的管理员都知道自定义脚本放在哪里,方便维护

    shell脚本的基本结构以及如何执行

    [image]

    Shell脚本通常都是以.sh 为后缀名的,这个并不是说不带.sh这个脚本就不能执行,只是大家的一个习惯而已所以,以后你发现了.sh为后缀的文件那么它一定会是一个shell脚本了。test.sh中第一行一定是 “#! /bin/bash” 它代表的意思是,该文件使用的是bash语法如果不设置该行,那么你的shell脚本就不能被执行。’#’表示注释,在前面讲过的后面跟一些该脚本的相关注释内容以及作者和创建日期或者版本等等当然这些注释并非必须的,如果你懒的很,可以省略掉,但是笔者不建议省略因为随着你工作时间的增加,你写的shell脚本也会越来越多,如果有一天你回头查看你写的某个脚本时,很有可能忘记该脚本是用来干什么的以及什么时候写的所以写上注释是有必要的另外系统管理员并非你一个,如果是其他管理员查看你的脚本,他看不懂岂不是很郁闷该脚本再往下面则为要运行的命令了

    [image]

    Shell脚本的执行很简单,直接”sh filename “ 即可,另外你还可以这样执行

    [image]

    默认我们用vim编辑的文档是不带有执行权限的,所以需要加一个执行权限,那样就可以直接使用’./filename’ 执行这个脚本了另外使用sh命令去执行一个shell脚本的时候是可以加-x选项来查看这个脚本执行过程的,这样有利于我们调试这个脚本哪里出了问题

    [image]

    shell脚本中用到了’date’这个命令,它的作用就是用来打印当前系统的时间其实在shell脚本中date使用率非常高有几个选项笔者常常在shell脚本中用到:

    [image]

    %Y表示年,%m表示月,%d表示日期,%H表示小时,%M表示分钟,%S表示秒

    [image]

    注意%y%Y的区别

    [image]

    -d 选项也是经常要用到的,它可以打印n天前或者n天后的日期,当然也可以打印n个月/年前或者后的日期

    [image]

    另外星期几也是常用的

    [image]

    【shell脚本中的变量

    shell脚本中使用变量显得我们的脚本更加专业更像是一门语言,开个玩笑,变量的作用当然不是为了专业如果你写了一个长达1000行的shell脚本,并且脚本中出现了某一个命令或者路径几百次突然你觉得路径不对想换一下,那岂不是要更改几百次?你固然可以使用批量替换的命令,但是也是很麻烦,并且脚本显得臃肿了很多变量的作用就是用来解决这个问题的

    [image]

    test2.sh中使用到了反引号,你是否还记得它的作用?’d’’d1’在脚本中作为变量出现,定义变量的格式为 “变量名=变量的值”。当在脚本中引用变量时需要加上’$’符号,这跟前面讲的在shell中自定义变量是一致的下面看看脚本执行结果吧

    [image]

    下面我们用shell计算两个数的和

    [image]

    数学计算要用’[ ]’括起来并且外头要带一个’$’。脚本结果为:

    [image]

    Shell脚本还可以和用户交互

    [image]

    这就用到了read命令了,它可以从标准输入获得变量的值,后跟变量名。”read x”表示x变量的值需要用户通过键盘输入得到脚本执行过程如下:

    [image]

    我们不妨加上-x选项再来看看这个执行过程:

    [image]

    test4.sh中还有更加简洁的方式

    [image]

    read -p 选项类似echo的作用执行如下:

    [image]

    你有没有用过这样的命令”/etc/init.d/iptables restart “ 前面的/etc/init.d/iptables 文件其实就是一个shell脚本,为什么后面可以跟一个”restart”? 这里就涉及到了shell脚本的预设变量实际上,shell脚本在执行的时候后边是可以跟变量的,而且还可以跟多个不妨笔者写一个脚本,你就会明白了

    [image]

    执行过程如下:

    [image]

    在脚本中,你会不会奇怪,哪里来的$1$2,这其实就是shell脚本的预设变量,其中$1的值就是在执行的时候输入的1,而$2的值就是执行的时候输入的$2,当然一个shell脚本的预设变量是没有限制的,这回你明白了吧另外还有一个$0,不过它代表的是脚本本身的名字不妨把脚本修改一下

    [image]

    执行结果想必你也猜到了吧

    [image]

    【shell脚本中的逻辑判断

    如果你学过C或者其他语言,相信你不会对if 陌生,在shell脚本中我们同样可以使用if逻辑判断shellif判断的基本语法为:

    1)不带else

    if 判断语句; then

    command

    fi

    [image]

    if1.sh中出现了 ((a<60))这样的形式,这是shell脚本中特有的格式,用一个小括号或者不用都会报错,请记住这个格式,即可执行结果为:

    [image]

    2)带有else

    if 判断语句 ; then

    command

    else

    command

    fi

    [image]

    执行结果为:

    [image]

    3)带有elif

    if 判断语句一 ; then

    command

    elif 判断语句二; then

    command

    else

    command

    fi

    [image]

    这里的 && 表示并且的意思,当然你也可以使用 || 表示或者,执行结果:

    [image]

    以上只是简单的介绍了if语句的结构在判断数值大小除了可以用”(( ))”的形式外,还可以使用”[ ]”。但是就不能使用>, < , = 这样的符号了,要使用 -lt (小于),-gt (大于),-le (小于等于),-ge (大于等于),-eq (等于),-ne (不等于)

    [image]

    再看看if中使用 &&  ||的情况

    [image]

    shell 脚本中if还经常判断关于档案属性,比如判断是普通文件还是目录,判断文件是否有读写执行权限等常用的也就几个选项:

    -e :判断文件或目录是否存在

    -d :判断是不是目录,并是否存在

    -f :判断是否是普通文件,并存在

    -r :判断文档是否有读权限

    -w :判断是否有写权限

    -x :判断是否可执行

    使用if判断时,具体格式为: if [ -e filename ] ; then

    [image]

    shell 脚本中,除了用if来判断逻辑外,还有一种常用的方式,那就是case具体格式为:

    case 变量 in

    value1)

    command

    ;;

    value2)

    command

    ;;

    value3)

    command

    ;;

    *)

    command

    ;;

    esac

    上面的结构中,不限制value的个数,*则代表除了上面的value外的其他值下面笔者写一个判断输入数值是奇数或者偶数的脚本

    [image]

    $a 的值或为1或为0,执行结果为:

    [image]

    也可以看一下执行过程:

    [image]

    case脚本常用于编写系统服务的启动脚本,例如/etc/init.d/iptables中就用到了,你不妨去查看一下

    【shell脚本中的循环

    Shell脚本中也算是一门简易的编程语言了,当然循环是不能缺少的常用到的循环有for循环和while循环下面就分别介绍一下两种循环的结构

    [image]

    脚本中的seq 1 5 表示从15的一个序列你可以直接运行这个命令试下脚本执行结果为:

    [image]

    通过这个脚本就可以看到for循环的基本结构 

    for 变量名 in 循环的条件; do

    command

    done

    [image]

    循环的条件那一部分也可以写成这样的形式,中间用空格隔开即可你也可以试试,for i in `ls`; do echo $i; done  for i in `cat test.txt` do echo $i; done

    [image]

    再来看看这个while循环,基本格式为:

    while 条件; do

    command

    done

    脚本的执行结果为:

    [image]

    另外你可以把循环条件忽略掉,笔者常常这样写监控脚本

    while :; do

    command

    done

    【shell脚本中的函数

    如果你学过开发,肯定知道函数的作用如果你是刚刚接触到这个概念的话,也没有关系,其实很好理解的函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可有时候脚本中的某段代总是重复使用,如果写成函数,每次用到时直接用函数名代替即可,这样就节省了时间还节省了空间

    [image]

    fun.sh 中的sum() 为自定义的函数,在shell脚本中要用

    function 函数名() {

    command

    }

    这样的格式去定义函数

    上个脚本执行过程如下:

    [image]

    有一点笔者要提醒你一下,在shell脚本中,函数一定要写在最前面,不能出现在中间或者最后,因为函数是要被调用的,如果还没有出现就被调用,肯定是会出错的

    Shell脚本大体上就介绍这么多了,笔者所举的例子都是最基础的,所以即使你把所有例子完全掌握也不代表你的shell脚本编写能力有多么好所以剩下的日子里你尽量要多练习,多写脚本,你写的脚本越多,你的能力就越强希望你能够找专门介绍shell脚本的书籍深入的去研究一下它随后笔者将给你留几个shell脚本的练习题,你最好不要偷懒

    1. 编写shell脚本,计算1-100的和;

    2. 编写shell脚本,要求输入一个数字,然后计算出从1到输入数字的和,要求,如果输入的数字小于1,则重新输入,直到输入正确的数字为止;

    3. 编写shell脚本,把/root/目录下的所有目录(只需要一级)拷贝到/tmp/目录下;

    4. 编写shell脚本,批量建立用户user_00, user_01, … ,user_100并且所有用户同属于users组;

    5. 编写shell脚本,截取文件test.log中包含关键词’abc’的行中的第一列(假设分隔符为”:”),然后把截取的数字排序(假设第一列为数字),然后打印出重复次数超过10次的列;

    6. 编写shell脚本,判断输入的IP是否正确(IP的规则是,n1.n2.n3.n4,其中1<n1<255, 0<n2<255, 0<n3<255, 0<n4<255

    以下为练习题答案:

    1. #! /bin/bash

    sum=0

    for i in `seq 1 100`; do

    sum=$[$i+$sum]

    done

    echo $sum

    2. #! /bin/bash

    n=0

    while [ $n -lt "1" ]; do

    read -p "Please input a number, it must greater than "1":" n

    done

     

    sum=0

    for i in `seq 1 $n`; do

    sum=$[$i+$sum]

    done

    echo $sum

     

    3. #! /bin/bash

    for f in `ls /root/`; do

    if [ -d $f ] ; then

    cp -r $f /tmp/

    fi

    done

     

    4. #! /bin/bash

    groupadd users

    for i in `seq 0 9`; do

    useradd -g users user_0$i

    done

     

    for j in `seq 10 100`; do

    useradd -g users user_$j

    done

     

    5. #! /bin/bash

    awk -F':' '$0~/abc/ {print $1}' test.log >/tmp/n.txt

    sort -n n.txt |uniq -c |sort -n >/tmp/n2.txt

    awk '$1>10 {print $2}' /tmp/n2.txt

     

    6. #! /bin/bash

    checkip() {

    if echo $1 |egrep -q '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$' ; then

    a=`echo $1 | awk -F. '{print $1}'`

    b=`echo $1 | awk -F. '{print $2}'`

    c=`echo $1 | awk -F. '{print $3}'`

    d=`echo $1 | awk -F. '{print $4}'`

     

    for n in $a $b $c $d; do

    if [ $n -ge 255 ] || [ $n -le 0 ]; then

    echo "the number of the IP should less than 255 and greate than 0"

    return 2

    fi

    done

    else

    echo "The IP you input is something wrong, the format is like 192.168.100.1"

    return 1

    fi

    }

     

    rs=1

    while [ $rs -gt 0 ]; do

    read -p "Please input the ip:" ip

    checkip $ip

    rs=`echo $?`

    done

    echo "The IP is right!"

    展开全文
  • 学习书籍

    学习书籍

    Linux命令行与shell脚本编程大全.第3版

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    

    第一个脚本程序

    #!/bin/bash
    date;who
    
    展开全文
  • 本书结合丰富的实际案例介绍了如何利用shell命令快速开发常规任务,如何凭借短短几个命令行从Web挖掘数据的shell脚本,如何通过srlell脚本设置以太网和无线LAN,以及如何利用少量命令的组合完成诸如文本处理、文件...
  • shell脚本.pdf

    2019-09-05 10:54:30
    详细且实用的shell脚本入门级pdf书籍,内容点比较基础,案列相对较多,适合shell初学者使用。
  • 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i; i++)); do touch test_$i.txt done 示例解释 第1行:指定脚本解释器,这里是用/bin/sh做解释器的第...
  • 终于到shell 脚本这章了,在以前笔者卖了好多关子说shell脚本怎么怎么重要,确实shell脚本在linux系统管理员的运维工作中非常非常重要。下面笔者就带你正式进入shell脚本的世界吧。 到现在为止,你明白什么...
  • linux shell脚本编程 自动化脚本 awk sed grep find 文本分析 LinuxShell命令行及脚本编程实例详解 ...Linux-Shell脚本编程书籍代码 把平时有用的手动操作做成脚本,这样可以便捷的使用 awk 与 sed 学习,包括了...
  • 后来接触到了《Linux就该这么学》这本书, 和其他的Linux书籍一样,会有很多基础的知识点,供初学者看,在我看来,这本书的优点在于它不仅把知识点讲解的很清晰,而且还很实用,配合的练习都很有针对性,这对于没有...
  • awk是一个基于列的文本处理工具,另外还有一个基于行模式的sed,本文简要介绍awk的基本使用 示例 awk按行读取文本并视为一条记录,每条...本文介绍了awk的一个基础入门用法,更多的操作参考相关文档或书籍
  • 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员。目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目。有的单位甚至用shell脚本的编写能力...
  • shell脚本学习基础

    千次阅读 多人点赞 2018-06-16 09:04:19
    本篇博客将会介绍(Contents): 1、什么是shell,shell解释器和命令(或称工具)之间有什么区别 2、“变量”和“命令”的区别 ... 5、如何执行shell脚本 6、接下来几篇博客内容 7、使用和参考书籍 Refer...
  • 入门linux命令行及shell脚本编程的书籍
  • ubuntu下shell脚本基础与入门

    千次阅读 2014-10-11 11:14:02
    今天阅读项目的sh脚本,特地kan
  • 《Linux命令行与shell脚本编程大全第3版》,已经勘误。高清文字版,带完整标签。书中描述清晰,可作为Linux shell入门和进阶书籍
  • 高清电子版书籍,经典linux入门书籍《Linux命令行与shell脚本编程大全》
  • shell脚本本身是基于高层的开发,所以不宜做底层的编程,但是在高层做一些系统应用的配置和管理,恰到好处。1 学习shell脚本好的资料 网上资料  可以看看知乎上的,学习shell有什么好书推荐?  shell脚本学习...
  • 第十四章 SHELL 脚本

    2015-03-24 11:02:12
    脚本这章了,在以前笔者卖了好多关子说shell脚本怎么怎么重要,确实shell脚本在linux系统管理员的运维工作中非常非常重要。下面笔者就带你正式进入shell脚本的世界吧。 到现在为止,你明白什么是shell脚本吗?如果...
  • 日常的linux系统管理工作中必不可少的就是shell脚本,如果不会写shell脚本,那么你就不算一个合格的管理员。目前很多单位在招聘linux系统管理员时,shell脚本的编写是必考的项目。有的单位甚至用shell脚本的编写能力...
  • 作为一本面向Linux入门用户的书籍,本书力求语言通俗易懂,用例简单明了,便于读者阅读领会。同时,全书穿插了不少要求读者动手实践的内容,不但可加深读者对内容的理解和消化,同时也可通过动手实践激发读者对Linux...
  • 作为一本面向Linux入门用户的书籍,本书力求语言通俗易懂,用例简单明了,便于读者阅读领会。同时,全书穿插了不少要求读者动手实践的内容,不但可加深读者对内容的理解和消化,同时也可通过动手实践激发读者对Linux...
  • Shell文档 ChinaUnix上大神“網中人”总结的Shell十三问,强烈推荐,这本书讲得比较精炼,而且都是一些Shell学习中容易把握不住的一些细节难点。每一问都写得非常精彩。ChinaUnix上,还有个... 《Shell脚本...
  • RT 做Linux网络编程已经一年了,但是...求有关这方面的开发或者懂这方面的大神 推荐一本入门shell脚本书籍! 多谢啦[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/onion/17.gif][/img]

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,663
精华内容 2,265
关键字:

shell脚本入门书籍