Linux Shell编程从入门到精通--笔记1

1. echo.sh

#! /bin/sh
cd /tmp
echo "hello world!"

运行

chmod +x echo.sh   #将echo.sh的权限变为可执行
./echo.sh

运行linux程序的3种方法:使文件具有可执行权限,直接运行文件;直接调用命令解释器执行程序;使用source执行文件。

shell执行程序流程:先判断程序是否有执行权限(shell脚本中有执行命令,所以要判断),调用linux内核命令新建(fork)一个进程,在新建的进程中调用我们指定的命令。对于解释型的文件,内核返回“not executable format file”,由此shell知道这是个脚本文件,然后启动一个新的shell进程来执行这个程序。脚本第一行“#! /bin/sh”告诉shell创建一个什么样的进程来执行此脚本。

2. shell命令的种类

  • 內建命令, shell程序本身包含的命令,集成在shell解释器中,如cd內建命令、echo內建I/O命令。在执行內建命令时,没有进程的创建和消亡。
  • Shell函数, 一系列程序代码,以shell语言写成,可以像其他命令被引用。
  • 外部命令, 独立于shell的可执行程序,如find、grep、echo.sh,命令行shell在执行外部命令时会创建一个当前shell复制进程来执行。执行过程如下:

            1> 调用POSIX系统fork函数接口,创建shell进程的复制进程(子进程)

            2> 在子进程的运行环境中查找外部命令在Linux文件系统中的位置

            3> 在子进程中以新程序取代shell拷贝,并执行exec,此时父进程进入休眠,等待子进程执行完毕

            4> 子进程执行完毕后父进程接着从终端读取下一条命令。

3. shell中的变量

    shell中的变量名没有长度限制,没有类型区分(一切值都是字符串,也没长度限制)

    shell中变量定义时注意“=”两边不要有空格; 当赋值的内容包含空格式,加引号,如:with_space="this contains spaces"

    当想使用变量名称来获取值时,在名称前加"$"符号。echo $with_space。其实这是${with_space}的简写

    被双引号括起来的变量,替换是不会被阻止的。被单引号括起来的变量替换是被禁止的。变量名只会被解释成字面意思,不会发生变量替换

>>> var=123
>>> echo '$var'
$var
>>> echo "$var"
123

局部变量:必须以local声明,否则即使在代码块中,它也是全局可见的

全局变量:环境变量也是全局变量的一种

用echo输出变量:echo $PATH    echo "hello world!"

环境变量:每个进程都有自己的“环境”,这个环境由一组变量组成,这些变量中存有进程可能需要引用的信息。每次shell启动时,它将创建适合自己环境变量的shell变量。如果一个脚本需要设置一个环境变量,那么需要将这些变量“export”出来,就是通知到脚本本地的环境。一个脚本只能export变量到这个脚本所产生的子进程,也就是说只能对这个脚本所产生的命令和进程器作用。

  export 命令用于设置当前进程的环境变量,但是有效期仅仅维持到当前进程消亡为止。下次重新登录到命令行shell时以前对shell的export设置都无法恢复。如果想要把对环境变量的设置永久保存,则可以将export命令置于shell登录时执行的启动文件中。如/etc/profile export PATH=/bin:.....

    env命令用于临时改变环境变量的值

    >>> env -i PATH=./:$PATH echo.sh

-i 使shell执行echo.sh时,清空所有由父shell继承来的环境变量,仅仅设置命令中指定的PATH,这样在执行echo.sh时就不需要给出完整路径(./echo.sh),直接给出命令文件名就可以了

你可能感兴趣的:(linux)