目录

第4章 脚本与环境交互

环境变量

在你登录系统时会启动一个超级的父shell,而环境变量就是这个父shell设置的变量。与普通变量不同的是,它们是被export后的变量。

那么export是什么呢?shell中的变量有作用域,在当前shell中赋值(VAR=1)的变量只能在当前shell中用,如果想在它的子shell中用,需要export,相当于作用域的扩展(有点类似C++的protected成员)。

因此,环境变量就是由系统shell预先设置并export后,给以后的所有子shell用的变量

运行脚本的方式

因为有了变量作用域,运行脚本的方式就很关键,如果是在子shell中运行则不能继承当前shell中赋值但是没有export的变量;如果是直接在当前shell中执行脚本,则可以继承所有变量。

开一个subshell

  • sh a.sh
  • ./a.sh 这个要求有可执行权限,其它三个都不需要

在当前shell中运行

  • source a.shsource命令)
  • . ./a.sh(“点操作符”)

为了验证,只需:在父shell中设置环境变量且不export,在a.sh中打印该环境变量即可

细锁:Shell如何初始化

对于最朴素的sh(即Bourne Shell),在家目录下会有一个.profile文件,它运行这个文件。

对于其它shell,登入 & 启动一个新终端时分别的情况分别如下,对于我只需关心bash。比如要添加开机自启,只需在以下任意一个文件里加。

/images/image-20220513205121300.png

Q:zsh是如何做到将默认终端替换为自己的?

⭐处理命令行参数

shell有几个特殊的变量保存了命令行信息

  • $# 参数个数
  • $1,$2,...,$9(没有$10!),依次保存了9个参数
  • $0 脚本的名字

让脚本“可执行”

复习:文件权限

1
2
$ ls -l myls3
-rw-rw-r-- 1 ericfj engineering 124 Oct 12 22:39 myls3

列出文件权限时,一共9个字母,分三组,分别是所有者、所属组、其它所有用户的权限。

chmod命令可以改变文件/文件夹权限

设置Magic Line

就是#!,指定了这个文本文件应该被什么程序执行,比如#!/bin/sh

文件

脚本被设计出的初衷就是为了处理文件。