环境变量与文件查找
1.变量
变量就是Shell变量,创建变量可以使用declare进行预声明。实际上Linux变量是即用即创建的。例如如下temp=shiyanlou即可。按照作用域来划分,shell的变量的可以分为以下三种:
- 局部变量(local variable):只能在函数内部使用。
- 全局变量(global variable):指变量在当前的整个 Shell 进程中都有效。每个 Shell 进程都有自己的作用域,彼此之间互不影响。在 Shell 中定义的变量,默认就是全局变量
- 环境变量(environment variable):还可以在子进程中使用。如使用export命令将全局变量变为环境变量。
1.1创建变量
使用echo命令和
可
以
读
取
一
个
变
量
的
值
,
可以读取一个变量的值,
可以读取一个变量的值,表示引用一个变量的值。
【注意】
需要注意到,在赋值时,变量名、等号和值之间不能含有 空格。变量的值可以是可以扩展为字符串的任意值。在扩展期间,变量名称可以使用花括号括起来,避免因上下文二变得不明确(如被扩展为新的变量名,导致在使用多参数命令时,为空)。例子如下:
$filename1被理解为新的变量filename1的值,理所当然是空,导致mv命令缺少参数。正解如下,将变量名使用{}括起来之后,1就不会被错误地理解为变量名的一部分。
【变量命名规则】
并是任何形式的变量名都是可用的,变量名只能是英文字母、数字或者下划线,且不能以数字作为开头。这一点与Java编程语言类似。
1.2 环境变量
环境变量的作用域比自定义变量的要大,如shell的环境变量作用于自身和它的子进程。在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,除了创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。
1.3 对比export、env、set
1.4 环境变量与全局变量的区别
zsh是创建子shell,从默认的shell切换到zsh shell。使用export可以将全局变量变为环境变量,全局变量只在当前进程(shell)有效,不与其他shell共享,所以当切到zsh子shell时,tmp的值为空,表示该变量无效。
1.5 永久变量和临时变量
Linux的变量按照生命周期来划分,可以分为以下两类:
1、永久的:需要修改配置文件,变量永久生效;
2、 临时的:使用 export 命令行声明即可,变量在关闭 shell 时失效。
Linux中有两个重要的配置文件, /etc/bashrc 和 /etc/profile ,它们分别存放的是 shell 变量和环境变量。除此之外,每个用户目录下的一个隐藏文件,这个.profile只对当前用户永久生效。
而写在 /etc/profile 里面的是对所有用户永久生效,所以如果你想添加一个永久有效的环境变量,只打开/etc/profile,在其中添加即可。
1.6 创建shell脚本
1、 创建shell脚本
2、在hello_shell.sh文件夹下输入如下内容:
#!/bin/bash
for ((i=0; i<10; i++));do
echo "hello shell"
done
exit 0
3、为文件添加可执行权限并执行:
1、创建一个 C 语言“ hello world ”程序:
2、输入如下内容:
#include <stdio.h>
int main(void)
{
printf("hello world!\n");
return 0;
}
3、编译hello_world.c文件为二进制文件hello_world
cd … 回到上一级目录,也就是 shiyanlou 目录,当再想运行那两个程序时,会发现命令红字。提示命令找不到。这需要用到后面的将命令路径添加到 PATH 环境变量操作了。
1.7 将命令路径添加到 PATH 环境变量
要像使用系统命令一样执行自己创建的脚本文件或者程序就要将命令所在路径添加到 PATH 环境变量了。使用:
$ PATH=$PATH:/home/shiyanlou/mybin
可以将自定义路径添加到PATH中
1.8 删除变量
#让添加的环境变量全局有效 .zshrc是zsh shell的配置文件 shell窗口每次打开都会默认执行
# >> 表示将标准输出以追加的方式重定向到一个文件中而不是覆盖 注意>会覆盖
echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
# 让环境变量立即生效
source .zshrc
2.搜索文件命令
2.1 whereis
whereis 这个搜索很快,因为它并没有从硬盘依次查找,而是直接从数据库中查询。但是只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s)。如果想要获得更全面的搜索结果可以使用 locate 命令。
2.2 locate
locate通过“ /var/lib/mlocate/mlocate.db ”数据库查找。使用locate命令前要先进行update,这是因为这个数据库不是实时更新的,系统每天使用定时任务自动执行updatedb命令。
安装locate
查找 /etc 下所有以 sh 开头的文件
查找 /usr/share/ 下所有 jpg 文件
如果想只统计数目可以加上 -c 参数,-i 参数可以忽略大小写进行查找
注意,它不只是在 /etc 目录下查找,还会自动递归子目录进行查找。
2.3 find命令
find 应该是这几个命令中最强大的了,它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。
查找/etc目录下文件名为interfaces的文件
千万记住 find 的第一个参数是要搜索的地方
练习
找出 /etc/ 目录下的所有以 .list 结尾的文件
有一个非常重要的文件(sources.list)但是你忘了它在哪了,你依稀记得它在 /etc/ 目录下,现在要你把这个文件找出来,然后设置成自己(shiyanlou 用户)可以访问,但是其他用户并不能访问。
目标
- 找到 sources.list 文件
- 把文件所有者改为自己(shiyanlou)
- 把权限修改为仅仅只有自己可读可写