Skip to content

变量

[!hint] 变量

  • 与其他编程语言相同,有类型,有作用域,可以给变量赋值
  • 变量名只能是英文字母、数字或者下划线,且不能以数字作为开头

  • 创建变量 declare 变量名

  • 给变量赋值 tmp=shiyanlou

  • 读取变量 echo $变量名$ 表示引用一个变量的值

  • 删除变量 unset 变量名

bash
$ declare testname                             
$ testname=ttt111                                                       
$ echo $testname                                           
ttt111

环境变量

环境变量 是特殊的变量,它不仅在当前 shell 中可用,也可以被子 shell,或者程序访问

[!hint] 为了与普通变量区分,通常我们习惯将环境变量名大写

  • 每个进程都有其各自的环境变量设置
  • 默认情况下,当一个进程被创建时,它将继承其父进程的绝大部分环境设置【如果不在创建过程中明确指定的话
  • 某个进程的环境变量作用于自身和它的子进程

[!hint] Shell 程序也作为一个进程运行在操作系统之上,而我们在 Shell 中运行的大部分命令都将以 Shell 的子进程的方式运行

变量类型

  • 当前 Shell 进程私有用户自定义变量【自己使用 declare 创建的变量,只在当前 Shell 中有效】
  • Shell 本身内建的变量
  • 从自定义变量导出的环境变量

打印环境变量

300

  • set:显示当前 Shell 所有变量,包括其内建环境变量【与 Shell 外观等相关】,用户自定义变量,导出的环境变量
  • env:显示与当前用户相关的环境变量,还可以让命令在指定环境中运行
  • export:显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量

[!hint] 如何区分 变量 与 环境变量 ?

某个变量在当前进程的子进程有效则为环境变量

bash
# 将普通变量转为环境变量
$ temp1=aaa                                                                       
$ echo $temp1                                                                
aaa

# 创建子 shell
$ zsh             
# 打印出来值为空
$ echo $temp1                                                               

# 退出子 shell
$ exit                                                                               
$ echo $temp1                                                                 
aaa

# 导出temp1为环境变量
$ export temp1                                                                      
$ zsh                                                                                     
$ echo $temp1                                                                             
aaa

变量的生存周期

  • 永久的:需要修改配置文件,变量永久生效
  • 临时的:使用 export 命令行声明,变量在关闭 shell 时失效

  • 存放变量的文件
    • /etc/bashrc 存放 shell 变量
    • /etc/profile 存放对所有用户永久生效的环境变量
    • /home/用户/.profile 存放对当前用户永久生效的环境变量

PATH

PATH 是一个特殊的环境变量,当我们在 Shell 中执行一个命令时,系统就会按照 PATH 中设定的路径按照顺序依次到目录中去查找【如果存在同名的命令,则执行先找到的那个】


  • 查看 PATH 中的内容,echo $PATH

命令在当前目录有效

bash
# 创建一个C语言程序
cd /home/shiyanlou
touch hello_world.c
vim hello_world.c

# 添加内容-------------------
#include <stdio.h>

int main(void)
{
    printf("hello world!\n");
    return 0;
}

# 使用 gcc 生成可执行文件【具有可执行权限】
gcc -o hello_world hello_world.c

# 运行,由于没有添加到 PATH,所以要加 ./
./hello_world

[!hint] 当我们在别的目录中,再想运行那两个程序时,会发现提示命令找不到【除非加上命令的完整路径】,这时,我们可以将命令所在路径添加到 PATH,我们就可以像使用系统命令一样执行自己创建的脚本文件或者程序了

添加到 PATH【命令在当前 Shell 有效】

[!hint] PATH 中的路径以 : 作为分隔符

  • PATH=$PATH:/home/shiyanlou 将这个路径【一定要使用绝对路径】添加到 PATH

但是当我一关闭终端,下次开启后又失效了

添加到配置脚本【命令在全局有效】

  • 将命令添加到配置脚本中
bash
# 将使用echo打印出的字符串,使用 >> 追加到.zshrc文件的后面
echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
# shell 启动时,会自动执行这条命令【将这个路径添加到 PATH】

# 使配置脚本立即生效【不需要重启shell】
source .zshrc

[!hint] 在每个用户的 home 目录中,有一个 Shell 每次启动时会默认执行一个配置脚本【初始化环境,添加一些用户自定义环境变量……】

  • 如果 Shell 是 zsh,那配置文件就是 .zshrc
  • 如果是 Bash,则配置文件为 .bashrc

[!hint] cat /etc/shells 查看当前系统已安装的 Shell

删除/修改 PATH

变量设置方式说明
${变量名#匹配字串}从头向后开始匹配,删除符合匹配字串的最短数据
${变量名##匹配字串}从头向后开始匹配,删除符合匹配字串的最长数据
${变量名%匹配字串}从尾向前开始匹配,删除符合匹配字串的最短数据
${变量名%%匹配字串}从尾向前开始匹配,删除符合匹配字串的最长数据
${变量名/旧的字串/新的字串}将符合旧字串的第一个字串替换为新的字串
${变量名//旧的字串/新的字串}将符合旧字串的全部字串替换为新的字串
bash
# 将PATH赋值给mypath
mypath=$PATH
echo $mypath

# 删除
mypath=${mypath%/home/shiyanlou/mybin}

搜索文件

  • whereis 文件 简单快速,不全面
  • locate 快速,一般全面【刚添加的文件会找不到】
  • find 最强大,可以根据文件的属性进行查找
  • which 只在 PATH 中搜索

whereis

  • whereis 搜索二进制,man 帮助,源代码文件
    • -b 只搜索二进制文件
    • -m 只搜索 man 帮助文件
    • -s 只搜索源代码文件
bash
# 查找带有who的文件
whereis who
who: /usr/bin/who /usr/share/man/man1/who.1.gz

locate

安装

locate 不是内置命令,需要手动安装:

bash
sudo apt-get update
sudo apt-get install locate
sudo updatedb

操作

  • locate
    • -c 统计查找出的文件的数目
    • -i 忽略大小写进行查找
    • -b 只搜索二进制文件
    • -m 只搜索 man 帮助文件
    • -s 只搜索源代码文件
bash
# 查找 `/etc` 下所有以 sh 开头的文件:
locate /etc/sh

# 查找 `/usr/share/` 下所有 jpg 文件
locate /usr/share/*.jpg

locate -c /usr/share/*.jpg
18

find

find 路径 参数 动作 不但可以通过文件类型、文件名进行查找而且可以根据文件的属性【文件的时间戳,文件的权限……】进行搜索

  • find
    • 参数
      • -name 文件名 根据文件名来搜索文件
      • -atime 最后访问时间
      • -ctime 最后修改文件内容的时间
      • -mtime 最后修改文件属性的时间
        • -mtime n 在 n 天之前的“一天之内”修改过属性的文件
        • -mtime +n 在 n 天之前【不包含 n 天本身】被修改过属性的文件
        • -mtime -n 在 n 天之前【包含 n 天本身】被修改过属性的文件
      • -newer 文件名 列出比该文件更新的文件【文件内容修改时间更近】
    • 动作
      • -print 打印出找到的文件的名称【默认
bash
# 在`/etc/`目录及其所有子目录中,搜索名为`interfaces`的文件
find /etc/ -name interfaces

# 列出 home 目录中,24 小时之内有改动的文件
find ~ -mtime 0

which

which 不是用来搜索文件的,是用来搜索程序,命令的

bash
shiyanlou:~/ $ which java                        
/usr/lib/jvm/java-8-openjdk-amd64/bin/java