环境变量
变量:shell变量,就是计算机中用于记录一个值的符号,而这些符号将用于不同的运算处理中。通常变量是与值是一对一关系,可以通过表达式读取它的值赋值给其他变量,也可以直接指定数值赋值给任意变量。变量的作用域即变量的有限范围,在该范围内只能有一个同名变量,一旦离开则该变量无效。
在shell中创建一个变量名为tmp的变量 $declare tmp(只是预声明一个变量),也可以直接给变量赋值 tmp=forever(中间不可以有空格)。读取变量的值,使用echo命令和$符号($符号用于表示引用一个变量的值) $echo $tmp。变量名只能是英文字母、数字或下划线,且不能以数字作为开头。
环境变量:作用域比自定义变量大,如Shell的环境变量作用域自身和它的子进程,在所有的UNIX和类UNIX系统中,每个进程都有其个子的环境变量设置,且默认情况下,当一个进程被创建时,处理创建过程中明确指定的话,它将继承器父进程的绝大部分环境设置。Shell程序也作为一个进程运行在操作系统之上,我们在Shell中运行的大部分命令都将以Shell的子进程方式运行。
通常我们会涉及到的环境变量有三种:当前Shell进程私有用户自定义变量,只在当前Shell中有效;Shell本身内建的变量;从自定义变量导出的环境变量。与上述三种环境变量相关的命令分别是set,env,export。为了与普通变量进行区分,常将环境变量名大写。
set:显示当前Shell所有环境变量,包括其内建环境变量,用户自定义变量及导出的环境变量
env:显示与当前用户相关的环境变量,还可以让命令在指定环境中运行
export:显示从Shell中导出环境变量的变量,也能通过它将自定义变量导出为环境变量
$ temp=shiyanlou
$ export temp_env=shiyanlou
$ env | sort>env.txt
$ export | sort>export.txt
$ set | sort>set.txt
$ vimdiff env.txt export.txt set.txt //使用vimdiff比较三个导出文件的内容
$ temp=shiyanlou
$ echo temp
$ zsh //创建子shell
$ echo $temp
$ exit
$ export temp
$ zsh
$ echo $temp
命令的查找路径与顺序:Shell是通过环境变量PATH搜索的。$ echo $PATH(查看环境变量的内容)
$vim hello_shell.sh
#!/bin/zsh
for((i=0; i<10;i++));do
echo "hello shell"
done
exit 0 //在vim中编辑
$ chmod 755 hello_shell.sh //为文件添加可执行权限
$ vim hello_world.c
#include<stdio.h>
int main(void){
printf("hello world! ");
return 0;
}
$ gcc -o hello_world hello_world.c //使用gcc生成可执行文件
$ mkdir mybin
$ mv hello_shell.sh hello_world mybin/
$ cd mybin
$ ./hello_shell.sh
$ ./hello_world
添加自定义路径到PATH环境变量
PATH路径是以:作为分隔符。
$ PATH=$PATH:/home/shiyaolou/mybin //这里一定要使用绝对路径,但当你退出终端后,添加的环境变量又失效了
在每个用户的home目录中有一个Shell每次启动都会默认执行一个配置脚本,以初始化环境,包括添加一些用户自定义环境变量等。zsh的配置文件是.zshrc,相应的Bash的配置文件为.bashrc。它们在ect下还都有一个或多个全局的配置文件,不过一般指修改用户目录下的配置文件。
$ echo "PATH=$PATH:/home/shiyanlou/mybin">>.zshrc // >>表示将标准输出以追加的方式重定向到一个文件中,若是>则是以覆盖的方式重定向到一个文件中。
修改和删除已有变量
变量修改有以下几种方式:
${变量名#匹配字串} 从头向后开始匹配,删除符合匹配字串的最短数据
${变量名##匹配字串} 从头向后开始匹配,删除符合匹配字串的最长数据
${变量名%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最短数据
${变量名%%匹配字串} 从尾向前开始匹配,删除符合匹配字串的最长数据
${变量名/旧的字串/新的字串} 将符合就字符串的第一个字串替换为新的字串
${变量名//旧的字串/新的字串} 将符合字串的全部字串替换为新的字串
变量删除 $ unset temp
我们在Shell中修改了一个配置脚本文件后,每次都要退出终端重新打开甚至重启主机之后才能生效,但我们可以使用source命令来让其立即生效。 $ source .zshrc source命令还有个别名是. $ . ./.zshrc(第一个点后面有一个空格,且后面的文件必须指定完整的绝对或相对路径名,source则不需要)。
搜索文件
与搜索相关的命令常用的有:whereis,which,find,locate。
$ whereis who //简单快速 这个搜索很快,并没有从硬盘中依次查找,而是直接从数据库中查找。whereis只能搜索二进制文件(-b),man帮助文件(-m)和源代码文件(-s)。
$ locate /etc/sh //快而全 通过“/var/lib/mlocate/mlocate.db”数据库查找。不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行updatedb命令更新一次。所以有时刚添加的文件会找不到,需要手动执行updatedb命令。它可以用来查找指定目录下的不同文件类型。
$ locate /usr/share/*.jpg //查找/usr/share/下所有jpg文件 *前面的表示转义 若想只统计数目可以加上-c参数,-i可以忽略大小写进行查找。whereis的-b,-m,-s同样试用。
which本身是Shell内建的一个命令,通常使用which来确定是否安装了某个指定的软件,因为它只从PATH变量的指定的路径中去搜索命令。
$ which man //精而细
find不但可以通过文件类型、文件名进行查找,而且还可以根据文件的属性进行搜索。
$ find /etc/ -name interfaces //find命令的路径是作为第一个参数的,基本命令格式为find[path][option][action]
与时间相关的命令参数:
-atime 最后访问时间 -ctime 创建时间 -mtime 最后修改时间
-mtime n : n为数字,表示在n天之前的"一天之内"修改过的文件
-mtime +n : 列出在n天之前(不包含n天本身)被修改过的文件
-mtime -n : 列出在n天之前(包含n天本身)被修改过的文件
newer file : file为一个已存在的文件,列出比file还要新的文件名
$ find ~ mtime 0 //列出home目录中,当天24小时内有改动的文件
$ find ~ newer Documents/test.c~ //列出用户家目录下比Document/test.c~文件新的文件
数字雨
$ sudo apt-get update; sudo apt-get install cmatrix