• Shell脚本学习(一)


    Unix/Linux上常见的Shell脚本解释器有bash、sh、csh、ksh等,Linux中最常用的是bash。

    脚本语言是一种解释型语言,会执行这类程序时,解释器(interpreter)需要读取我们编写的源代码(source code),并将其转换成目标代码(object code),再由计算机运行。

    而我们常见的C、C++、Java都是编译型语言。这类语言需要预先将我们写好的源代码(source code)转换成目标代码(object code),这个过程被称作“编译”。

    #!/bin/bash
    echo "Hello World !"

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

    像perl脚本通常会在第一句加上

    #!/usr/bin/perl -w

    对于加上这些标记的脚本,可以通过修改权限直接执行它们,比如这样:

    chmod +x ./test.sh
    ./test.sh

    chmod 是linux中修改权限的一个命令,+x表示给后面那个文件加上可执行的属性。

    然后使用./test.sh就能运行脚本了。

    为什么一定要用./test.sh才能运行脚本,直接使用test.sh却不行呢?

    因为PATH这个环境变量默认后面是没有加./的,如果直接执行test.sh自然是无法被找到的

    [root@localhost addPort]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

    当然如果不加这个约定的标记,只需要这样就能执行bash脚本了

    bash test.sh

    使用 read 命令可以读取终端stdin的数据

    read inputString
    echo "input String is $inputString"

    会发现上面两个inputString一个加了$一个没有加,为什么?

    我的理解是,当这变量被当做左值时,不需要加$,而当这个变来那个被当做右值时,必须加$

    Shell声明一个变量

    testString1="hello"
    testString2='world'
    testInt=123

    初始化的时候必须注意的是,=号两边都不能有空格,不然是错误的,shell对格式的要求比较严格。

    使用变量的时候就需要加上$符号了,因为这个时候它被当做一个右值来使用。

    echo $testString1
    echo $testString2
    echo "${testInt}456"

    当然,必要的时候需要加上花括号,这样才会跟后面的字符串分隔开,用作解释器限定边界。

    readonly :在变量前面加上readonly可以限定为只读变量

    unset:使用unset可以删除变量,删除变量以后再输出这个变量将不会有数据输出。

    shell当中存在二种变量类型,分别是局部变量环境变量

    局部变量只能在shell当前脚本中使用,而环境变量能被创建它们的shell脚本以及派生出来的子进程中使用。

    在Shell当中还有一些比较特殊的变量

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

    $n和C语言main函数当中的char* argv[]比较相似,都是传递进来的参数,$#对应的就是int argc了,比如有两个路径,需要分别用ls命令查看目录信息,这个时候可以这样:

    #!/bin/bash
    myPath1=$1
    myPath2=$2
    ls $1
    ls $2
    echo $#

    然后执行这个脚本

    [root@localhost /]# chmod +x 123.sh 
    [root@localhost /]# ./123.sh /mnt/ /usr/
    cdrom  hgfs
    bin  etc  games  include  lib  lib64  libexec  local  sbin  share  src  tmp
    2

    第一行打印的就是第一个参数ls以后的列表,第二行打印的就是第二个参数ls以后的列表,第三行打印的就是参数的个数。

    $*和$@被直接使用的时候,他们的参数都会被当成一个个体使用,而当两者都被""包含时,"$*"会将参数组合成一个整体字符串输出,而"$@"的参数任然是一个个体。

  • 相关阅读:
    线程 day40
    进程同步(multiprocess.Lock、multiprocess.Semaphore、multiprocess.Event) day38
    进程 day36
    操作系统的发展史 day36
    git项目.gitignore文件不生效解决办法
    Java8 Lambda表达式和流操作如何让你的代码变慢5倍
    @GetMapping和@PostMapping接收参数的格式
    Non-parseable POM C:Usersadmin.m2 epositoryorgspringframework问题解决方案
    hessian
    eclipse 中PlantUML的安装和使用
  • 原文地址:https://www.cnblogs.com/viroyiheng/p/3988787.html
Copyright © 2020-2023  润新知