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),直接给出命令文件名就可以了