RHEL7--第三章
- 输入输出重定向
标准输入重定向(STDIN,文件描述符为 0 );键盘输入,也可从其他文件或命令输入
# tr [a-z] [A-Z ] < /etc/fstab
标准输出重定向(STDOUT,文件描述符为 1 = 1>,1可以省略);默认输出至屏幕
# ls /etc/fstab > /tmp/aaa.txt 会覆盖旧内容
# ls /etc/passwd >> /tmp/aaa.txt 追加内容,不覆盖旧内容
错误输出重定向(STDERR,文件描述符为 2 = 2>,2不可省略);默认输出至屏幕
# ls error1.txt 2> /tmp/error.txt 会覆盖旧内容
# ls error2.txt 2>> /tmp/error.txt 追加内容,不覆盖旧内容

Note:
1:输出重定向的使用率要比输入重定向高;
2:文件描述符需要细细了解,否则 &1 这个概念就不好理解;
命令解析:
1:#COMMAND >> a文件 2>&1
标准输出与错误输出至共同的文件中(追加至原有内容后面);
文件描述符:
标准输出为1,1可省略不写直接 > 表示;
错误输出为2,2不可省略 2> ;
& 表示相当于等效于标准输出;
&1 表示标准输出至 a文件;
2>&1 表示错误输出至之前的标准输出 a文件中;
可以通过网络查询相关解释,多百度多GOOGLE。
2:命令 << 分节符
# cat << EOF
当输入EOF字符时,输入结束
# cat > /path/to/somefile << EOF
输入字符重定向至/path/to/somefile,当输入EOF时,输入结束;
- 管道命令符
把前一个命令原本要输出到屏幕的标准数据当作后一个命令的标准输入;
格式:命令A | 命令B | 命令C .....
# ls /etc/passwd | wc -l
命令解析:
1:# echo "passwd123" | passwd --stdin root
通过管道符和passwd的--stdin参数相组合,完成root的密码修改;
解决自动化脚本一个致命缺陷,需要输入两次密码进行确认。
- 命令行的通配符,glob
通配符种类:
* :匹配零个或多个字符;
?:匹配任意单个字符;
[ ] :匹配指定范围内的任意单个字符;
如:[0-9]:只匹配数字
[a-z]:不区分大小写
[A-Z]:只匹配大写
[^]:匹配指定范围外的任意单个字符;
如:a[^0-9]b 匹配除0-9数字之外的任意单个字符;
专用字符集合:
[:digit:]:任意数字,相当于0-9
[:lower:]:任意小写字母
[:upper:]:任意大写字母
[:alpha:]:任意大小写字母
[:alnum:]:任意数字或字母
[:space:]:空格字符
[:punct:]:标点符号;
# ls a [[:digit:]]b
- 常用的转义字符
4个最常用的转义字符:
反斜杠 \ :使反斜杠后面的一个变量为单纯的字符串;
# PRICE=5 设置变量 PRICE 的值为 5;
# echo "Price is $$PRICE "
# Price is 3767PRICE
当存在两个 $ 符号时,双引号引用变量属性,所以结果不同;
# echo "Price is \$$PRICE"
当加入 \ 后,第一个 $ 的变量为单纯字符串
# Price is $5
单引号 '' :转义其中所有的变量为单纯的字符串;
# echo 'Price is $PRICE'
# Price is $PRICE PARIC变量不生效,纯字符
双引号 "" :保留其中的变量属性,不进行转义处理;
# PRICE=5
# echo "Price is $PRICE"
# Price is 5
反引号 `` :把其中的命令执行后返回结果;按键1 左边的就是反引号;
# ehco `uname -a`

- 重要的环境变量
何为变量:
变量是一个很重要的概念,无论是bash脚本还是其他语言,都是如此。在bash中,创建变量很简单,给变量一个名称即可。默认情况下,变量的值为空。我们可以通过等号为变量赋值。需要注意的是,变量和变量的值不是一个概念。
当给定变量一个名称后,例如:MYVAR,我们需要通过 $ 取得变量的值,即 $MYVAR。使用echo输出变量的值。
# MYVAR=/etc/passwd 变量名赋值
# echo $MYVAR 或 # cat $MYVAR
#/etc/passwd 或 # 显示passwd内容
Linux系统中最重要的10个环境变量:

相关命令:
1:alias
格式:alias 别名=' 命令 ' ,命令需要加单引号;
# alias cdetc='cd /etc'
# unalias cdetc 删除cdetc别名;
# source /etc/profile
2:type
判断内部外部命令,格式:type 命令
# type man
# man is /usr/bin/man 表示man为外部命令;
# type type
# type is a shell builtin 表示type为内部命令;
3:unset
# unset MYVAR 删除指定变量名;
4:env
# env 显示环境变量;
5:set
# set 设置本地变量;
6:export
1):# export 变量名=变量值 显示和设置环境变量;即设置了变量且此变量在子shell也能运行;
2):如果当只设置了 变量名=变量值 ,需要让此变量在子shell中生效时,运行如下:
# 变量名=变量值 设置变量并赋值
# XXX=abcd
# export 变量名 此变量名即为环境变量,子shell中生效;
# export XXX
# bash 进入子shell
# echo $XXX 查看是否XXX变量在子shell中生效;
# echo $BASHPID 查看当前bash进程号
# exit 退出子shell
3):添加环境变量的值
# export PATH=/etc : $PATH
在PATH变量的最左边添加路径 /etc ;并在子shell中生效;
有效期限:临时改变,只在当前shell中生效;仅限于当前用户;
4):修改环境变量的值
# vi ~/.bash_profile
7:查看当前有几个子shell
# ps -aux | grep bash
Linux中命令分为:内部和外部命令
内部命令:shell内嵌命令
# help COMMAND 查看命令帮助
外部命令:存在在一个目录中,使用时需要去目录中查找,这些目录被定义为 PATH 变量;
# man COMMAND 查看命令帮助
#COMMAND --help 查看命令帮助
bash的配置文件
按生效范围划分,存在两类:
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc
按功能划分,存在两类:
profile类:为交互式登录的shell提供配置
全局:/etc/profile,/etc/profile.d/*.sh
个人:~/.bash_profile
功用:
(1)用于定义环境变量
(2)运行命令或脚本
bashrc类:为非交互式登录的shell提供配置
全局:/etc/bashrc
个人:~/.bashrc
功用:
(1)定义命令别名
(2)定义本地变量
shell登录:
交互式登录:
1、直接通过终端输入账号密码登录
2、使用 su - USERNAME 或 su -l USERNAME 切换的用户
交互式登录读取顺序:
/etc/profile ->/etc/profile.d/*.sh ->~/.bash_profile ->~/.bashrc ->/etc/bashrc
非交互式登录
1、su USERNAME
2、图形界面下打开的终端
3、执行脚本
非交互式登录读取顺序:
~/.bashrc ->/etc/bashrc ->/etc/profile.d/*.sh
编辑配置文件定义的新配置的生效方式:
(1)重新启动shell进程
(2)使用source或.命令进程,此方式有副作用
问题:
1、定义对所有用户都生效的别名
2、让用户的PATH环境变量的值多出一个路径,例如多个/usr/local/apache2/bin
# export PATH="$PATH:/usr/local/apache2/bin"
# echo $PATH
或:
# declare -x PATH="usr/local/apache2/bin"
# echo $PATH
浙公网安备 33010602011771号