精华内容
下载资源
问答
  • Shell编程之变量

    2021-03-08 21:10:15
    本文主要对Shell中的变量进行简单总结,另外本文所使用的Linux环境为CentOS Linux release 8.1.1911,所使用的Shell为bash 4.4.19(1)-release。

    本文主要对Shell中的变量进行简单总结,另外本文所使用的Linux环境为CentOS Linux release 8.1.1911,所使用的Shell为bash 4.4.19(1)-release

    一、变量的分类

    Shell编程中的变量一般分为三类:

    • 局部变量(自定义变量):在脚本或命令中定义,仅在当前shell中有效,其他shell启动的程序不能访问局部变量。
    • 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量(这种一般是系统环境变量),有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
    • 特殊变量:由Shell程序设置的特殊变量,这些特殊变量只能使用不能对它们赋值。常见的特殊变量有$n$#$*$@$?$$

    补充说明:$n(除了$0)又叫位置参数,$0$#$*$@$?$$这些又叫特殊参数。参数是存储值的实体。它可以是一个名字,一个数字,或者前面的#*@等特殊字符之一。

    二、自定义变量

    1.定义变量

    Shell支持以下三种定义变量的方式:

    # variable为变量名,value为变量值
    variable=value
    variable='value'
    variable="value"
    

    注意:在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。

    变量定义规则:

    • 变量名由数字、字母、下划线组成,但不能以数字开头。
    • 赋值号=两侧不能有空格。
    • 变量值如果包含空白符,必须使用双引号或单引号包围起来。
    • 不能使用Shell里的关键字作为变量名。

    变量定义示例:
    1

    2.使用变量

    使用一个定义过的变量,有以下两种语法:

    $variable
    ${variable}
    

    变量名外的花括号{}是可选的,加花括号是为了帮助解释器识别变量的边界。推荐给所有变量都加上花括号{}。使用变量示例:
    2
    skill变量不加{},解释器就会把$skillScript当成一个变量,可能不是预期结果,加花括号适用于拼接字符串。

    3.修改变量的值

    已定义的变量可以被重新赋值。修改变量值的示例:
    3

    4.只读变量

    使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变。语法:

    readonly variable
    

    只读变量示例:
    4

    5.删除变量

    使用unset命令可以删除变量。变量被删除后不能再次使用,unset命令不能删除只读变量。语法:

    unset variable
    

    删除变量示例:
    5

    6.单引号与双引号的区别

    有以下示例脚本:

    #!/bin/bash
    
    name="zhang san"
    echo 'hello! ${name}'
    echo "hello! ${name}"
    

    执行结果:
    6
    可知单引号与双引号的区别:

    • 单引号包围变量的值时,引号里面的内容原样输出,即使引号里面有变量和命令也会把它们原样输出。这种方式适合需要显示纯字符串的情况,即不希望解析变量、命令等的场景。
    • 双引号包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式适合字符串中附带有变量和命令并且想将其解析后再输出的场景。

    7.命令替换

    命令替换用命令的输出取代命令本身,Shell中完成命令替换有以下两种方式:

    # commands是要执行的命令,可以只有一个命令,也可以有多个命令,多个命令之间以分号;分隔
    `command`
    $(command)
    

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

    variable=`command`
    variable=$(command)
    

    将命令的输出结果赋值给变量的示例:

    #!/bin/bash
    
    mkdir testdir
    cd testdir
    test_path=`pwd`
    touch test_path.txt
    echo "test路径:${test_path}" >> test_path.txt
    echo $(cat test_path.txt)
    

    执行结果:
    7
    如果命令的输出结果包括多行(有换行符),或者含有多个连续的空白符,那么在命令的结果赋值给变量后输出变量时应该将变量用双引号包围,如果直接输出命令的结果,应该将反引号或$()包围的命令用双引号包围,防止出现格式混乱的情况。示例如下:
    8
    反引号看起来像单引号,容易造成混乱,更推荐使用$()。命令替换可以嵌套,使用反引号形式进行嵌套时,里面的反引号需要用反斜杠转义。以下是$()嵌套的示例,计算ls命令列出的第一个文件的行数:
    9
    注意$()仅在Bash中有效,而反引号可在多种Shell中使用。

    命令替换会创建一个子Shell来执行对应的命令。如果在Shell脚本中使用命令替换,那么运行该脚本的Shell会创建一个子Shell来执行对应的命令。

    三、环境变量

    1.Shell子进程

    用于登录某个虚拟控制器终端或在GUI中运行终端仿真器时所启动的默认的交互Shell可以看成一个Shell父进程。在命令提示符后输入/bin/bash命令或其他等效的bash命令时,会创建一个新的Shell进程,这个shell进程被称为Shell子进程(child shell)。Shell子进程也有命令提示符,同样会等待命令输入。有如下示例:
    10
    第一个Shell程序是Shell父进程,进程ID为5715,进程ID5754的进程是在Shell父进程中执行的第一个ps -f命令,执行bash后创建了一个新的Shell进程,即Shell子进程,进程ID为5755,进程ID为5774的进程是在Shell子进程中执行的第二个ps -f命令。Shell子进程的父进程ID(PPID)为5715,即Shell父进程的进程ID,说明这个Shell父进程就是该Shell子进程的父进程。

    注意:这里的Shell子进程(child shell)与子Shell(subshell)是两个概念,很容易混淆。Shell子进程(child shell)本质上是当前Shell通过执行外部命令启动了新进程,而这个新进程正好是Shell进程罢了,这样的child shell进程是通过执行硬盘上的命令来生成的,只能访问其Shell父进程的环境变量;而真正的子Shell是不需要重新执行硬盘上的外部命令的,全部是内存中的操作,可以访问其父Shell的任何变量。假设当前Shell创建了一个子Shell,子Shell肯定是当前Shell的子进程,当前Shell也被称为该子Shell的父Shell,但当前Shell的子进程不一定都是子Shell,比如当前Shell创建的Shell子进程(child shell)就不是子Shell。

    Shell父进程和Shell子进程的关系如下图:
    11
    在Shell子进程中也可以继续创建Shell子进程。有如下示例:
    12
    根据PPID可以看出Shell进程是层层嵌套。Shell子进程的嵌套关系如下图:
    13
    通过exit命令可以退出Shell子进程,还能用来登出当前的虚拟控制台终端或终端仿真器软件。退出Shell子进程的示例如下:
    14

    2.环境变量介绍

    环境变量对当前Shell进程和所有生成的Shell子进程都可用,而局部变量则只对创建它们的Shell进程可用。局部变量在Shell子进程中不可用。示例如下:
    15
    新开一个Shell窗口,局部变量在新的Shell进程中不可用。示例如下:
    16
    Shell子进程中定义的局部变量,在退出Shell子进程后,该局部变量就不可用。示例如下:
    17

    以上示例说明了局部变量在除定义它的Shell之外的其他Shell中都不可用,只有在定义它的Shell中可用。

    环境变量在设定它的Shell进程及其所有Shell子进程中可用,通过export命令可以将自定义变量导出为环境变量,语法:

    # 可以同时导出多个变量
    export variable1 variable2
    # 可以在定义的同时导出为环境变量
    export variable3="abc"
    

    示例如下:
    18
    反过来在Shell子进程中设定的环境变量在Shell父进程中不可用。示例如下:
    19
    修改Shell子进程中的环境变量并不会影响到Shell父进程中该变量的值。示例如下:
    20
    Shell子进程甚至无法使用export命令改变Shell父进程中环境变量的值。示例如下:
    21
    在Shell子进程中删除一个环境变量只对Shell子进程有效,该环境变量在Shell父进程中依然可用。示例如下:
    22

    以上可总结为环境变量只能向下传递而不能向上传递,在Shell子进程中对环境变量的改动无法反映到Shell父进程中。

    环境变量在设定它的Shell进程及其所有Shell子进程中可用,并没有说它在所有的Shell进程中都可用,也就是说环境变量在与设定它的Shell进程完全没有关联的Shell进程中是不可用的。如果新开了一个Shell窗口,这个新开Shell显然不是当前Shell的Shell子进程,环境变量在这个新的Shell进程中不可用。示例如下:
    23

    3.查看环境变量

    可以使用envprintenv命令查看环境变量,以下是截取的部分环境变量:
    24
    查看个别环境变量的值可以使用printenv命令(变量前不加$),也可以使用echo(变量前加$),不要用env命令。示例如下:
    25
    通过set命令可以查看所有环境变量、自定义变量和函数。

    4.常用系统环境变量

    这里只列出一部分常用系统环境变量:

    变量描述
    BASH当前Bash实例的全路径
    BASHPID当前Bash进程的PID
    HOME当前用户的主目录
    HOSTNAME主机名
    HOSTTYPE主机的架构,如x86_64
    HISTFILE保存Shell历史记录列表的文件名
    HISTSIZE历史文件中的命令数
    LANGShell的语言环境类别
    OLDPWD之前的路径
    PATHShell查找命令的目录列表,由冒号分隔
    PWD当前的路径
    PS1Shell命令行界面的主提示符
    PS2Shell命令行界面的次提示符
    SHELLShell的全路径名
    SHLVLBash进程的嵌套层次,每启动一个新的Bash时该变量都加1

    系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。自己创建的局部变量一般使用小写字母。变量名区分大小写,自定义变量时使用小写字母,能够避免重新定义系统环境变量可能带来的灾难。

    5.Shell的启动方式

    Shell的启动方式有交互式、非交互式和登录、非登录两类:

    • 交互式Shell与非交互式Shell:
      • 交互式Shell:Shell的一种运行模式,Shell与用户进行交互,用户输入命令,Shell立即执行并反馈结果。
      • 非交互式Shell:Shell的另一种运行模式,Shell不与用户进行交互,运行脚本文件让所有命令批量化、一次性地执行。
    • 登录Shell与非登录Shell:
      • 登录式Shell:需要用户名、密码登录后才能进入的Shell或通过带有-l|--login参数的bash命令启动的Shell。例如系统启动,远程登录,su -切换用户,bash --login命令启动bash。
      • 非登陆式Shell:不需要输入用户名和密码即可打开的Shell。例如图形化界面终端启动,su切换用户,bash命令启动bash。

    判断Shell是否是交互式Shell

    方法1,查看变量-的值值,如果值中包含了字母i,则表示交互式。在控制台输出-的值:
    26
    包含i,为交互式。在以下脚本中输出-的值:
    27
    不包含i,执行脚本的Shell为非交互式。

    方法2,查看变量PS1的值,如果非空,则为交互式,否则为非交互式。在控制台输出PS1的值:
    28
    不为空,为交互式。在以下脚本中输出PS1的值:
    29
    为空,执行脚本的Shell为非交互式。

    判断Shell是否是登录Shell

    方法1,执行shopt login_shell,值为on为登录Shell,off为非登录Shell。登录控制台后查看,为on,是登录Shell,bash命令启动一个新的Shell后再查看,值为off,这个新启动的Shell为非登录Shell:
    30
    方法2,通过exit退出Shell,输出logout,表示之前退出的为登录Shell,输出exit,表示之前退出的为非登录Shell。先在控制台执行bash -l启动一个Shell,退出后输出logout,之前启动的为登录Shell,再执行bash启动一个Shell,退出后输出exit,之前启动的为非登录Shell:
    31

    将命令组合起来,使用echo $PS1; shopt login_shellecho $-; shopt login_shell同时判断是否交互和登录。
    使用由()包围的组命令或者命令替换进入子Shell时,子Shell会继承父Shell的交互和登录属性。
    ssh执行远程命令,但不登录时为非交互式非登录Shell。
    执行Shell脚本时(在新启动的Shell进程中执行),为非交互式非登录Shell,指定了--login时,为非交互式登录Shell。

    6.Shell配置文件的加载

    Bash Shell启动时相关的配置文件有:

    • /etc/profile
    • /etc/bashrc
    • /etc/profile.d/*.sh
    • ~/.bash_profile
    • ~/.bash_login
    • ~/.profile
    • ~/.bashrc

    Bash Shell启动时配置文件怎么加载取决于Bash Shell的启动方式。

    登录Shell加载配置文件

    登录Shell启动时配置文件的加载流程如下图:
    32

    1. 先读取执行/etc/profile文件,/etc/profiles文件中有加载/etc/profile.d/*.sh的语句,会加载/etc/profile.d/下所有可执行的sh后缀的脚本文件。
    2. 然后按下面书写的顺序寻找~/.bash_profile > ~/.bash_login > ~/.profile这三个文件,仅加载第一个找到的文件,然后该文件会加载~/.bashrc~/.bashrc中又有加载/etc/bashrc的命令,最后加载/etc/bashrc

    不同的Linux发行版附带的个人配置文件不同,有的可能只有~/.bash_profile~/.bash_login~/.profile这三个中的一个,有的可能三者都有。

    交互式非登录Shell加载配置文件

    交互式非登录Shell启动时配置文件的加载流程如下图:
    33
    不读取/etc/profile~/.bash_profile~/.bash_login~/.profile,读取~/.bashrc~/.bashrc文件还会加载 /etc/bashrc,最后再加载/etc/profile.d/*.sh

    非交互式非登录Shell加载配置文件

    执行Shell脚本时一般用的就是这种Shell。Shell启动一个非交互式非登录Shell进程时,会检查环境变量BASH_ENV来查看要执行的启动文件。如果有指定的文件,Shell会加载该文件,如果没有设置BASH_ENV,Shell脚本是通过启动一个Shell子进程来执行的,Shell子进程可以继承Shell父进程中的环境变量。对于在当前Shell进程中执行的Shell脚本,因为并没有启动一个新的Shell进程,所以执行脚本时不会加载配置文件,可以直接使用当前Shell中的变量。

    7.环境变量持久化

    通过export命令导出的环境变量只对当前Shell进程以及所有的子进程可用,如果最顶层的父进程被关闭了,那么环境变量也就失效了。只有将环境变量写入Shell配置文件中才能使该环境变量在所有Shell进程中都可用并且永久性存在,因为每次启动Shell进程都会定义这个变量。

    对于普通用户,可以将环境变量写入~/.bashrc文件,因为除了非交互式非登陆Shell设置了BASH_ENV并且没有指向~/.bashrc时,都会加载该文件。也可以将环境变量写入在/etc/profile.d目录中创建的一个以sh为后缀的文件里。不建议将新的环境变量写入/etc/profile,因为升级Linux发行版会使该文件更新,那自定义的环境变量也就没有了。这里以~/.bashrc为例,执行以下命令持久化保存一个环境变量:

    echo "export VAR1=env1" >> ~/.bashrc
    # 重载配置文件
    source ~/.bashrc
    

    在将环境变量写入~/.bashrc文件持久化保存后,该环境变量在所有Shell进程中都可用,如下图所示:
    34

    四、特殊变量

    1.$n

    $0代表shell或shell脚本的名称,通常为shell脚本文件名,n≥1时,$n代表传递给脚本或函数的参数。n是几,表示第几个参数。注意n≥10时,需要写成${n},例如${10}如果写成$10,则效果会变成$1的值拼接一个0。下面创建一个名为test1.sh的示例Shell脚本,代码如下:

    #!/bin/bash
    
    echo "执行的脚本文件名:$0"
    echo "传给脚本的第一个参数:$1"
    echo "传给脚本的第二个参数:$2"
    echo "传给脚本的第六个参数:$6"
    echo "传给脚本的第十个参数(不带{}):$10"
    echo "传给脚本的第十个参数(带{}):${10}"
    
    # 定义函数
    function func1() {
        echo "传给函数的第一个参数:$1"
        echo "传给函数的第二个参数:$2"
        echo "传给函数的第三个参数:$3"
    }
    
    # 调用函数
    func1 a b c
    

    执行脚本并附带参数:

    bash test1.sh aaa bbb ccc ddd eee fff ggg hhh iii jjj
    

    执行结果:
    35

    2.$#

    $#用于获取传递给脚本或函数的参数个数。下面创建一个名为test2.sh的示例Shell脚本,代码如下:

    #!/bin/bash
    
    echo "执行的脚本文件名:$0"
    echo "传给脚本的第一个参数:$1"
    echo "传给脚本的第二个参数:$2"
    echo "传给脚本的第三个参数:$3"
    echo "传给脚本的参数个数:$#"
    
    # 定义函数
    function func1() {
        echo "传给函数的第一个参数:$1"
        echo "传给函数的第二个参数:$2"
        echo "传给函数的参数个数:$#"
    }
    
    # 调用函数
    func1 a b c
    

    执行脚本并附带参数:

    bash test2.sh aaa bbb ccc ddd
    

    执行结果:
    36

    3.$*、$@

    $*$@都表示传递给函数或脚本的所有参数,当$*$@不被双引号""包围时,都是将接收到的每个参数看做一份数据,一般以空格分隔(以"$1" "$2""$n"的形式输出所有参数),当$*$@被双引号""包围时,"$*"会将所有的参数从整体上看做一份数据(以"$1 $2 … $n"的形式输出所有参数),而不是把每个参数都看做一份数据,"$@"仍然将每个参数都看作一份数据(以"$1" "$2""$n"的形式输出所有参数)。下面创建一个名为test3.sh的示例Shell脚本,代码如下:

    #!/bin/bash
    
    echo "执行的脚本文件名:$0"
    echo "传给脚本的所有参数(\$*):"$*
    echo "传给脚本的所有参数(\$@):"$@
    echo "传给脚本的所有参数(\"\$*\"):""$*"
    echo "传给脚本的所有参数(\"\$@\"):""$@"
    
    echo "从\$*打印传给脚本的每个参数"
    for var in $*
    do
        echo "${var}"
    done
    	
    echo "从\$@打印传给脚本的每个参数"
    for var in $@
    do
        echo "${var}"
    done
    
    echo "从\"\$*\"打印传给脚本的每个参数"
    for var in "$*"
    do
        echo "${var}"
    done
    
    echo "从\"\$@\"打印传给脚本的每个参数"
    for var in "$@"
    do
        echo "${var}"
    done
    
    # 定义函数
    function func1() {
        echo "传给函数的所有参数(\$*):"$*
        echo "传给函数的所有参数(\$@):"$@
        echo "传给函数的所有参数(\"\$*\"):""$*"
        echo "传给函数的所有参数(\"\$@\"):""$@"
    
        echo "从\$*打印传给函数的每个参数"
        for var in $*
        do
            echo "${var}"
        done
    
        echo "从\$@打印传给函数的每个参数"
        for var in $@
        do
            echo "${var}"
    	done
    
        echo "从\"\$*\"打印传给函数的每个参数"
        for var in "$*"
        do
            echo "${var}"
        done
    
        echo "从\"\$@\"打印传给函数的每个参数"
        for var in "$@"
        do
            echo "${var}"
        done
    }
    
    # 调用函数
    func1 a b c d e
    

    执行脚本并附带参数:

    bash test3.sh 1 3 5 7 9
    

    执行结果:
    37

    4.$?

    $?用于获取上个命令的退出状态,或上一个函数的返回值,一般0代表命令执行成功,非0代表命令执行失败。下面创建一个名为test4.sh的示例Shell脚本,代码如下:

    #!/bin/bash
    
    echo "执行的脚本文件名:$0"
    # 判断命令是否执行成功
    if [ $? == 0 ]
    then
        echo "退出状态为0,命令执行成功!"
    else
        echo "退出状态非0,命令执行失败!"
    fi
    
    abc
    if [ $? == 0 ]
    then
        echo "退出状态为0,命令执行成功!"
    else
        echo "退出状态非0,命令执行失败!"
    fi
    
    # 定义函数
    function add() {
        return $(expr $1 + $2)
    }
    
    # 调用函数
    add 2 3
    echo "函数的返回值:$?"
    

    执行脚本:

    bash test4.sh
    

    执行结果:
    38

    注意:严格来说,Shell函数中的return关键字用来表示函数的退出状态,而不是函数的返回值;Shell没有专门处理返回值的关键字。

    5.$$

    $$用于获取当前Shell进程ID,对于Shell脚本就是脚本所在的进程ID。在子Shell(subshell)中(如命令组合()),获取的是启动子Shell的Shell进程ID,而不是子Shell的进程ID。下面创建一个名为test5.sh的示例Shell脚本,代码如下:

    #!/bin/bash
    
    echo "执行的脚本文件名:$0"
    echo "执行的脚本所在的进程ID:$$"
    

    先输出当前Shell进程的进程ID,再执行脚本,结果如下:
    39

    调用$()时会创建一个子Shell来执行对应的命令。按理说在$()中的命令用$$获取到的是子Shell的进程ID,但是这种情况获取到的进程ID为启动子Shell进程的Shell进程ID,而不是子Shell的进程ID。

    展开全文
  • 以下是由77cn范文大全为大家整理的linux编程SHELL编程实验报告的相关范文,本文关键词为linux,编程,SHELL,实验,报告,Linux,编程,,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您...

    下载word有问题请添加微信号:xuecool-com或QQ:370150219处理(尽可能给您提供完整文档),感谢您的支持与谅解。

    以下是由77cn范文大全为大家整理的linux编程SHELL编程实验报告的相关范文,本文关键词为linux,编程,SHELL,实验,报告,Linux,编程,,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在综合文库中查看更多范文。

    Linux编程课程设计报告

    题 目: Linux Shell编程

    专 业 学 号 姓 名

    指 导 教 师 日 期

    - 1 -

    题目:Linux Shell编程

    一、 设计目的和任务

    实验目的:1.熟悉Shell环境和Shell的执行 2.熟悉Shell的基本语法和语句 3.了解Shell程序的调试方法 实验内容:1.编写Shell程序 2.调试和执行Shell程序

    二、 设计原理

    Linux是一种开放源码、能够免费使用及自由传播的类似于UNIX操作系统。它可运行于各种平台之上。因为它不但具有UNIX系统的良好性能(如稳定性、安全性),同由于其具有开源和免费的特点,也越来越广泛地应用于各种嵌入式系统中。

    Shell是用户和Linux操作系统内核程序间的一个借口。Shell既是命令解释器,有事一种编程语言。作为命令解释器,Shell为用户使用Linux操作系统提供丰富的工具界面。若用户输入命令,Shell负责解释执行该命令并向用户返回结果。作为编程语言,它利用自身的语言结构将工具命令组合起来提供更复杂的功能。

    三、 实验环境和总体设计

    1.PC一台

    2.安装虚拟机版的Linux操作系统

    四、详细设计步骤

    1.打开vmware软件,启动Linux系统 2.用root用户名和密码登入系统中

    3.将某目录下面所有的文件名后面加上所有者的名字,如a.txt的所有者为owner,修改后为a[owner].txt文件。 基本要求:

    ① 使用方法为usage:程序名称 目录名称

    若没有“目录名称”参数,则修改当前目录下文件名称

    ② 对目录中的子目录不做变化。

    ③ 给出实验结果。

    五、结果测试与分析

    1. 进入root模式 创建2618文件夹和zzf.cap文件

    - 2 -

    2.编写shell程序

    3.执行shell程序,遇到权限问题,修改权限,并列出目录下所有文件

    4.修改权限后再次执行shell程序

    成功

    六、存在的问题

    编写程序时路径出现错误,导致找不到该文件 修改前:

    - 3 -

    修改后

    七、总结

    - 4 -

    linux编程SHELL编程实验报告.doc

    免费范文网为全国范文类知名网站,下载全文稍作修改便可使用,即刻完成写稿任务。

    已有11人下载

    百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库linux编程SHELL编程实验报告在线全文阅读。

    本文来自:免费范文网(www.77cn.com.cn) 转载请注明出处!

    展开全文
  • Shell编程Shell概述.PDF

    2021-05-16 10:24:11
    Shell编程Shell概述.PDFShell 编程Shell 概述Shell 概念最初是在Unix操作系统中形成和得到广泛应用的。Unix Shell有很多种类,Linux系统继承了Unix系统中Shell的全部功能,现在默认使用的是bash 。1 Shell 的特点...

    Shell编程Shell概述.PDF

    Shell 编程

    Shell 概述

    Shell 概念最初是在Unix操作系统中形成和得到广泛应用的。Unix Shell有很多种类,Linux系统继

    承了Unix系统中Shell的全部功能,现在默认使用的是bash 。

    1 Shell 的特点

    Shell具有如下突出特点:

    (1)把已有命令进行适当组合构成新 命令。

    (2 )提供了文件名扩展字符(通配符,如* 、 ?、 [ ] ),使得用单一的字符串可以匹配多个文件名,省去键

    入一长串文件名 麻烦。

    (3)可以直接使用Shell的内置命令,而不需创建新的进 ,如Shell中提供 cd、echo、exit、pwd 、kill等命令。

    为防止因某些Shell不支持这类命令而出现麻烦,许多命令都提供了对应 二进制代码,从而也可以在新进 中

    运行。

    (4 )Shell允许灵活地使用数据流,提供通配符、输入/输出重定向、管道线等机制,方便了模式匹配、I/O处理

    和数据传输。

    (5)结构化 序模块,提供了顺序流 控制、条件控制、循环控制等。

    (6 )Shell提供了在后台执行命令的能力。

    (7)Shell提供了可配置 环境,允许创建和修改命令、命令提示符和其它的系统行为。

    (8 )Shell提供了一个高级的命令语言,能够创建从简单到复杂 程序。这些Shell 序称为Shell脚本,利用Shell

    脚本,可把用户编写的可执行程序与Unix命令结合在一起,当作新的命令使用,从而便于用户开发新 命令。

    2.常用Shell 类型

    Linux系统提供多种不同 Shell以供选择。常用的有Bourne Shell (简称sh)、C-Shelll (简称csh)、

    Korn

    Shell (简称ksh)和Bourne Again Shell (简称bash)。

    (1)Bourne Shell是AT&T Bell实验室 Steven Bourne为AT&T Unix开发的,它是Unix 默认Shell,也

    是其它Shell 开发基础。Bourne Shell在编程方面相当优秀,但在处理与用户 交互方面不如其它几种Shell。

    (2)C Shell是加州伯克利大学 Bill Joy为BSD Unix开发的,与sh不同,它 语法与C语言很相似。它提

    供了Bourne Shell所不能处理的用户交互特征,如命令补全、命令别名、历史命令替换等。但是,C Shell与

    BourneShell并不兼容。

    (3)Korn Shell是AT&T Bell实验室 David Korn开发的,它集合了C Shell和Bourne Shell 优点,并且

    与Bourne Shell向下完全兼容。Korn Shell 效率很高,其命令交互界面和编 互界面都很好。

    (4)Bourne Again Shell (即bash)是自由软件基金会(GNU)开发 一个Shell,它是Linux系统中一个默认

    Shell。Bash不但与Bourne Shell兼容,还继承了C Shell、Korn Shell等优点。

    3. Shell 脚本的建立

    Shell程序可以存放在文件中,这种被Shell解释执行的命令文件称为Shell脚本 (Shell scrīpt)。Shell

    脚本可以包含任意从键盘键入 Linux命令。

    建立Shell脚本 步骤同建立普通文本文件 方式相同,利用编辑器 (如vi)进行程序录入和编辑加工。

    例如,要建立一个名为ex1 Shell脚本,可在提示符后输入命令:

    $ vi ex1

    进入vi 插入方式后,就可录入程序行。完成编辑之后,将编辑缓冲区内容写入文件中,返回到Shell命

    令状态。

    4.执行Shell 脚本的方式

    执行Shell脚本 方式基本上有三种:

    (1)输入定向到Shell脚本

    这种方式是用输入重定向方式让Shell从给定文件中读入命令行并进行相应处理。其一般形式是:

    $ bash < 脚本名

    展开全文
  • Linux系统的Shell编程

    2021-11-16 17:56:50
    在学习Shell编程之前,我们应该要先知道什么是Shell 用户、Shell、Linux内核、硬件的关系如下图: Shell是一个应用程序,也可以说是一个命令解释器,它是用户和Linux内核之间的桥梁,可以将用户在图形界面上的...

    一. 什么是Shell

            1. 在学习Shell编程之前,我们应该要先知道什么是Shell

            用户、Shell、Linux内核、硬件的关系如下图:

            Shell是一个应用程序,也可以说是一个命令解释器,它是用户和Linux内核之间的桥梁,可以将用户在图形界面上的操作或在终端输入的命令传递给Linux内核,然后Linux内核再调度各个硬件及其他资源来完成用户的操作。

            什么是Linux的内核?在Linux操作系统中,真正能够操作计算机硬件完成某个用户功能的那一部分被称为Linux系统的内核。用户在使用Linux系统时,是不可以直接操作内核的,而是通过Shell来间接的操作内核的。Shell不属于内核的一部分,而是在Linux内核之外开发的应用程序,它将接收到的用户鼠标点击操作或输入的命令传递给内核,而内核再去调度硬件去完成指定的操作。这样用户就不需要直接操作内核,而是通过Shell间接地操作内核,内核也不会被直接的暴露于外部,保障了内核的安全性,也简化了用户的操作。

            Shell这个应用程序是开机即启动的,我们在操作Linux系统时,无时不刻都在直接或者间接地通过Shell去操作Linux内核。其实,在没有图形化界面之前,用户是通过终端或者控制台直接地去调用Shell这个应用程序,然后通过输入命令来操作Linux系统的。用户在控制台或者终端上看到的 $ 和 # 其实就是Shell的命令提示符,这表明用户已经进入了Shell这个程序,只需要输入命令,即可通过Shell来操作Linux内核。只不过root用户登录显示$,而普通用户登录显示#。

            另外,Shell在将用户的操作传递给内核的过程,就是在调用内核提供的API接口的过程。比如,用户在图形界面或者终端命令行做了一个打开文件的操作,而这个用户的操作Shell接收到后,就会去调用内核提供的相应的函数,然后内核再去调度硬件资源来完成用户的操作。

            2. 常见的Shell

            我们知道,Linux 是一个开源的操作系统,它是由世界各地的多个组织机构或个人共同开发完成的,每个组织机构或个人负责一部分功能,最后组合在一起,就构成了现在我们使用的 Linux。也正是这个原因,这些不同的组织机构或者个人都会开发出可以在Linux系统中使用的应用程序,而这些应用程序的功能可能是类似的,各有优缺点,至于使用哪一个由用户选择。而Shell就是这样的一个应用程序,所以Shell有很多个版本,目前Linux的大多数发行版默认使用的Shell是 bash shell。其他常见的Shell版本如下:

            (1) sh:sh 的全称是 Bourne shell,是 UNIX 上的标准 shell,很多 UNIX 版本都配有 sh。sh 是第一个流行的 Shell。

            (2) csh:这个 shell 的语法有点类似C语言,所以才得名为 C shell ,简称为 csh。

            (3) tcsh:tcsh 是 csh 的增强版,加入了命令补全功能,提供了更加强大的语法支持。

            (4) ash:一个轻量级占用资源少的 Shell,适合运行于低内存环境,与 bash shell 完全兼容。

            (5) bash:bash shell 由 GNU 组织开发,保持了对 sh shell 的兼容性,是各种 Linux 发行版默认配置的 shell。

            3. 查看Linux系统的Shell

           在Linux系统中,一般默认使用的Shell是bash shell。Shell是一个应用程序,一般都是放在/bin或者/user/bin目录下,而当前 Linux 系统可用的 Shell 都记录在/etc/shells文件中。

    (1) 查看系统当前可用的Shell,执行命令【cat -n /etc/shells】:

    (2) 查看系统当前默认使用的shell,执行命令【echo $SHELL】:

     

    (3) 查看各个用户使用的Shell,执行命令【cat -n /etc/passwd】:

    二. 什么是Shell编程

            1. 什么是Shell编程语言

            我们已经知道,Shell是一个应用程序,而这个应用程序不单单只是可以将用户的操作命令传递给Linux内核,它也支持编程。Shell都会对应一套编程语言的语法,而这套语言就被称为Shell编程语言或是Shell脚本语言。Shell编程语言和JavaScript语言一样是一种脚本语言,它不需要编译,而它的解释器就是Shell应用程序本身。

            我们平时工作中所说的Shell,大多数情况指的是Shell脚本语言,而不是Shell应用程序。

            2. 什么是Shell脚本 

            我们在使用Shell脚本语言时,可以和Linux系统的其他操作命令结合使用(如 ls、grep等等),而我们使用Shell脚本语言和其他命令结合编写能够完成某个特定功能的扩展名为.sh的文本,就叫做Shell脚本程序。

            3. 第一个Shell脚本

            我们已经知道,Shell有很多个版本,而每个版本支持的Shell脚本语言语法可能是有差异的,而下面的关于Shell脚本的所有例子都是针对于Bash Shell这个版本而言。

    (1)在根目录下新建一个Hello.sh脚本:【vim Hello.sh】

    (2)然后输入以下内容:

    #!/bin/bash     
    echo "Hello World "

            第一行:#! 是一个约定标记,它可以告诉系统这个脚本要使用哪个Shell版本作为解释器,后面紧跟的/bin/bash则是Shell的所在路径,所以【#!/bin/bash 】表示声明使用bin目录下的 bash shell 作为这个脚本的解释器;

            第二行:【echo "Hello World "】表示输出文本 Hello World !;

    (3)然后保存退出:【!wq】;

    (4)这样,一个能够输出 Hello World !的脚本就编写完成。

    补充说明:

           上面我们已经说过,Shell程序就是Shell脚本语言的解释器,而我们在使用终端时(例如通过Xshell连接Linux服务器的终端),其实就是已经进入了Shell这个程序,所以其实我们是可以在终端直接输入Shell编程语言的代码来运行的,而不需要写在脚本里再去运行。例如,声明一个变量并打印这个变量的值:

            (1)输入代码:【name=张三】,表示定义了一个变量name,它的值为张三;

            (2)输入代码:【echo $name】,表示打印变量name的值。

            当然,这种方式只适合去执行逻辑简单只有一两句代码的情况,大多数情况下我们还是将Shell编程代码写在.sh脚本中再去执行。

             4. 运行Shell脚本的方式

            上面我们已经编写了一个能够输出 Hello World !的Shell脚本运行,而现在我们就要执行 Hello.sh 这个脚本。而Shell脚本的执行方式有两种:

             第一种:给予.sh文本可执行权限,然后执行文本:

            (1)先给予Shell脚本可执行权限:【chmod +x Hello.sh】;

            (2)直接执行:绝对路径:【/Hello.sh】 或者   相对路径:【./Hello.sh】

                    注意,这里执行时如果使用的是相对路径,必须要以./开头,表示当前目录,否则系统会找不到脚本,从而导致执行失败。

             第二种:将 Shell 脚本作为参数传递给 Bash Shell 解释器:

            (1)这里使用Bash Shell来作为解释器,那么我们直接调用Bash Shell 这个程序,然后把Hello.sh这个脚本作为参数传给Shell即可:【/bin/bash Hello.sh】或 【bash Hello.sh】

            (2)这里需要注意,使用这种方式执行Shell脚本时,在Shell脚本的第一行中就不需要声明使用哪个版本的Shell来作为解释器,也就是不需要这行代码【#!/bin/bash】,因为我们运行脚本的命令中【/bin/bash Hello.sh】,就已经指明了使用哪个版本的Shell作为解释器。

                    注意,这种方式执行脚本文件时,如果使用的是相对路径,那么【/bin/bash ./Hello.sh】和【/bin/bash Hello.sh】是一样的,并无使用第一种执行方式中的区别。

    展开全文
  • SHELL编程命令大全

    2021-04-14 10:06:46
    tr工具 语法和选项 二、bash的特性 1、命令和文件自动补全 2、常见的快捷键 3、==常用的通配符(重点)== 4、==bash中的引号(重点)== 三、SHELL介绍 1. shell的种类 2. shell脚本的基本写法 3. shell脚本的执行...
  • Linux之Shell编程详解

    2021-10-26 22:58:53
    Shell编程 文章目录Shell编程一、Shell介绍二、Shell脚本的执行方式三、Shell的变量1. Shell变量介绍2. 自定义变量四、设置环境变量五、位置参数变量六、预定义变量七、运算符八、条件判断九、流程控制1. if语句2. ...
  • 本文主要对Shell中的数学计算命令进行简单总结,另外本文所使用的Linux环境为CentOS Linux release 8.1.1911,所使用的Shell为bash 4.4.19(1)-release。
  • Shell编程语言

    2021-03-04 18:02:39
    Shell是一门编程语言,作为学习shell的开始,需要事先搞明白:编程的目的是什么?什么是编程语言?什么是编程? ​ 编程的目的: #计算机的发明,是为了用机器取代/解放人力,而编程的目的则是将人类的思想流程按照...
  • shell编程案例

    2021-05-22 14:18:47
    2、设计一个shell程序,在每月第一天备份并压缩/etc目录的所有内容,存放在/root/bak目录里,且文件名为如下形式"yymmdd_etc.tar.gz",yy为年,mm为月,dd为日。 3、在文本文档1.txt第5行(假设文件行数大于5)后面...
  • Shell编程入门

    2021-03-01 16:25:06
    Shell 编程的 Hello WorldShell 变量Shell 编程中的变量介绍Shell 字符串入门Shell 字符串常见操作Shell 数组Shell 基本运算符算数运算符关系运算符逻辑运算符布尔运算符字符串运算符文件相关运算符shell流程控制if ...
  • 华南理工大学《操作系统 SHELL编程姓名: 余柳红 学号: 201330571011班级: 13信息安全班合作者: 无指导教师: 贺小箭实验概述【实验目的及要求】实验目的:熟悉linux常用命令,为以后的实验打下良好基础;...
  • Linux命令行操作及Shell编程基础

    万次阅读 2021-01-06 17:31:25
    一份以前的简单的shell脚本编程学习笔记;实例install_ros_kinetic.sh介绍
  • shell高级编程

    2021-05-17 13:52:24
    do sleep 1 echo $i done 函数介绍 函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程 它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序的一部分 ...
  • Linux之shell编程

    2021-08-07 21:57:30
    简介 shell脚本执行方式Shell 是一...Shell 编程一般指 shell脚本编程,不是指开发 shell 自身。 Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。 Linux 的
  • 初识shell编程

    2021-01-03 21:50:12
    本文主要内容是shell编程涉及到的一些入门知识,例如shell编程的定义及其语言特性,shell变量的相关知识,尤其是按照作用范围的分类,以及shell脚本的入门知识等
  • Linux的Shell编程

    2021-04-30 14:20:27
    Linux的Shell编程 4-30 vi e //进入脚本命令 e是被编程的量 echo “hello world” //输出hello world chmod u+x e ./e 某宾馆有如下要求,试编写一段代码来实现如下功能:从屏幕上读取顾客的姓名和电话号码。并将...
  • shell编程-信号处理

    2021-05-28 00:08:24
    screen命令 # 1、安装 [root@egon ~]# yum install screen -y # 2、运行命令 方式一:开启一个窗口并用-S指定窗口名,也可以不指定 [root@egon ~]# screen -S egon_dsb ''' Screen将创建一个执行shell的全屏窗口。...
  • 一,shell循环语句 echo命令 选项: -e 表示输出反斜杠转义符 -n 表示不换行输出 \n 输出换行 \t横向制表符 \b 表示退格不显示前一个字符 \c 抑制更多的输出或不换行 例: \b不能超过前面的字符否则会...
  • shell编程3

    2021-11-04 19:20:57
    做法:写一个shell文件,向test.txt中写入hello,定时器负责每分钟执行一次shell文件 为了方便开两个窗口,一个检查文件内容 另一个写shell文件和定时器任务,注意写全路径!!! vim hello.sh crontab -e 进入定时器...
  • Shell编程

    2021-04-03 14:46:18
    Shell变量1.1 定义变量1.2 使用变量1.3 只读变量1.4 删除变量1.5 变量类型2. 字符串2.1 单引号2.2 双引号2.3 拼接字符串2.4 获取字符串长度2.5 提取子字符串2.6 查找子字符串3. 数组3.1 定义数组3.2 读取数组3.3 ...
  • Shell编程-变量

    2021-07-07 19:51:08
    取消变量的方法为使用 unset :unset 变量名称 例如取消 myname 的设定: unset myname 三、 环境变量 这种变量是会影响bash环境操作的,会在真正进入系统前由一个bash程序读入到系统中。通常都环境变量的名字以...
  • Linux之Shell编程

    2021-12-06 23:23:03
    文章目录1、Shell脚本入门在一个shell脚本中访问另一个shell脚本的方式1.1 系统变量1.2 自定义变量1.3 特殊变量1.4 条件判断2、流程控制2.1 if判断2.2 case语句2.3 for循环2.4 while循环3、read读取控制台4、函数4.1...
  • shell编程文档资料

    2021-02-23 15:14:15
    shell编程文档资料 1、工具的使用 (1)、grep工具 grep是行过滤工具;用于根据关键字进行行过滤 语法: # grep [选项] '关键字' 文件名 常见选项: OPTIONS: -i: 不区分大小写 -v: 查找不包含指定内容的行,反向...
  • Shell编程规范与变量

    2021-01-03 02:22:16
    Shell编程规范与变量Shell脚本的构成Shell脚本的执行管道操作 |重定向重定向操作变量的分类定义新的变量查看变量的值赋值时使用引号read命令获取输入内容变量作用范围整数变量的运算环境变量位置变量预定义变量 ...
  • 本地变量在用户现在的 shell生命期的脚本中使用。如果在shell中启动另一个进程或退出,此 值将无效。这个方法的优点就是用户不能对其他的 shell或进程设置此变量有效。 格式 $ variable-name(变量名)=value(所赋...
  • Shell脚本编程-图书管理系统准备的数据库代码块前期准备进入页面主菜单展示图书查找图书添加图书编辑图书借书还书删除图书运行演示 准备的数据库 代码块 前期准备 #!/bin/bash #personal library managerment ...
  • 学习shell编程笔记 **变量** 自定义变量,整数运算,小数运算,环境变量,位置变量及预定义变量。 1)自定义变量: #name=moyun //中间无空格 #echo $name 重复定义变量: 第二次调用时,出来带上双引号也可用大...
  • Shell编程之概述

    2021-03-06 12:25:50
    本文主要对Shell的一些基本概念和Shell脚本的格式和执行进行简单总结,另外本文所使用的Linux环境为CentOS Linux release 8.1.1911,所使用的Shell为bash 4.4.19(1)-release。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 70,846
精华内容 28,338
关键字:

怎么进入shell编程