• 变量
  • io重定向
  • 管道pipe

  • var-变量 数学的方程式:设x=2,求y=x^2+2x+1 ?,x和y我们称为未知数,在shell脚本中称为变量,变量用来存储数据,指向内存空间的某个地址,当脚本中重复执行一长串相同代码时,可以使用变量替换,简化代码量,方便开发。

    • 变量赋值 var_name=value
    • 变量名命名规则: 1.变量名只能包含数字、字母和下划线,而且不能以数字开头; 2.变量名最好见名知义,命名机制遵循某种法则;不能够使用程序的保留字,例如if, else, for, while等等,不同版本稍有区别;
  • bash shell系统中的变量无需声明可以直接调用

  • 变量引用:$var_name /${var_name}

  • 变量类型:

本地变量:作用域仅为当前shell进程;
环境变量:作用域为当前shell进程及其子进程;
局部变量:作用域仅为某代码片断(函数上下文);
位置参数变量:当执行脚本的shell进程传递的参数;
特殊变量:shell内置的有特殊功用的变量;
		$?:判断上一条命令的执行结果
		0:表示成功,1~255:表示失败									
  • 引号的特殊含义:
单引号'':强引用,所有字符原样输出,不转义
双引号"":弱引用;输出引号内所有内容;若内容中有变量、特殊字符转义等会解析结果,然后在输出
反引号``:用于引用命令结果如同$(..)

  • 本地变量:仅在一个shell中有效,子进程不生效 用法:var_name=value 查看变量:set | grep var_name 撤销变量:unset var_name

  • 环境变量:在当前shell的所有子shell中生效 用法: 1. export name=value 2. name=value export name 3. declare -x name=value 4. name=value declare -x name

  • 只读变量:只读变量无法重新赋值,并且不支持撤销;存活时间为当前shell进程的生命周期,随shell进程终止而终止; 用法:  declare -r var_name=value  readonly var_name=value

  • 查看环境变量命令:export, declare -x, printenv, env,set

  • 但当再重新打开一个终端是,环境变量无效只在当前shell生效,需要定义在全局环境变量配置文件中才会生效。在登录系统时并启动一个shell,一般会加载配置文件中的环境变量。加载的文件跟登录的方式相关。 bash配置文件分为两类: -profile:为交互式登录shell进程提供配置

全局:对所有用户都生效;
			/etc/profile 
			/etc/profile.d/*.sh					
用户个人:仅对当前用户有效;
			~/.bash_profile					
用途:
			1、用于定义环境变量;
			2、运行命令或脚本;
 -bashrc:为非交互式登录shell进程提供配置
全局:
			/etc/bashrc 
用户个人:
			~/.bashrc					
用途:
			1、定义本地变量;
			2、定义命令别名;
 登录与非登录shells:
登录shells:
		1.任何通过用户登录的shell包括图形界面登录
		2.su -
 非登录shells:
		1.su
	    2.图形界面下的终端
		3.脚本
	    4.其他bash实例 
  • 下面通过在xuetong用户中的四个配置文件中添加echo "/path-dir"来验证加载的文件:/etc/profile,/etc/bashrc,~/.bahs_profile,~/.bashrc;
  • 配置文件的读取顺序: 所以如果希望在登录shell和非登录shell都能读到的文件应将变量设置在:~/.bashrc,/etc/bashrc
  • 如何让配置文件中变量生效 1. 通过命令行重复定义一次; 2. 让shell进程重读配置文件; source /path/conf_file . /path/conf_file

  • IO重定向 IO:input output,程序的数据流有三种:  输入数据流:默认标准输入为键盘 stdin  输出数据流:默认标准输出为显示器 stdout  错误输出流:错误输出也是通过显示器 stderr  分别使用文件描述:0、1、2 当我们不希望数据通过标准输入输出时,通过io重定向方法修改:
			输出重定向: >
							特点:会覆盖原有的内容
			输出追加重定向:>>
							特点:在原有的内容后面追加输出
			错误输出流重定向:2> 、2>>
			合并输出流(标准输出、错误输出):
						1.&>,&>>
						2.COMMAND > /path/to/somefile 2>&1
						   COMMAND >> /path/to/somefile 2>&1
			输入重定向:<
			多行文本输入:<<
					cat << eof
					cat > /path/to/somefile  << eof

有时候执行命令只关心命令有没有执行成功而不关心输出结果,需要用到特殊设备:/dev/null

  • 管道pipe: 用于连接程序,实现将前一个命令的输出直接定向后一个程序当作输入数据流 语法:  COMMAND1 | COMMAND2 | COMMAND3 | ... 例如:  # tail -n 6 /etc/passwd | tr 'a-z' 'A-Z' tr命令:把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符,或者输出字符 用法1:  tr SET1 SET2 < /PATH/FROM/SOMEFILE 用法2:  tr -d SET1 < /PATH/FROM/SOMEFILE 比如取出网卡的IP地址:

  • 双重定向:tee命令,可以同时将数据流输出至文件和屏幕 用法:  COMMAND | tee /PATH/TO/SOMEFILE | COMMAN --STDOUT  tee [OPTION]... [FILE]... 选项:  -a ,追加内容 eg:  tee [-a] /etc/yum.repos.d/docker.repo << 'EOF' == cat >>