面试题:为什么x和y的值为空,i和j却有value呢?
[root@localhost ~]# echo abc def | read x y ; echo x=$x ; echo y=$y
x=
y=[root@localhost ~]# cat value
1 2
[root@localhost ~]# read i j < value ; echo i=$i j=$j
i=1 j=2
解答:
Each command in a pipeline is executed as a separate process (i.e., in a subshell).
管道两边分别为两个独立的子进程
解决方案:
[root@localhost ~]# echo abc def |( read x y ; echo x=$x ; echo y=$y)
x=abc
y=def
[root@localhost ~]# echo abc def |{ read x y ; echo x=$x ; echo y=$y; }
x=abc
y=def
bash的配置文件
bash shell 的配置文件很多,可以划分为下面类别.
按生效范围划分两类
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/bash_profile
~/.bashrc
shell登录两种方式分类
交互式登录:
1. 直接通过终端账号密码登录
2. 使用 "su - UserName"切换用户
配置文件执行顺序:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录
1. su UserName
2. 图形界面下打开的终端
3. 执行脚本
4. 任何其他的bash实例
执行顺序:
/etc/profile.d/*.sh --> /etc/bashrc --> ~/.bashrc
按功能划分分类
profile类和bashrc类
1.profile类
profile类为交互式登录的shell提供配置
全局:/etc/profile, /etc/profile.d/*.sh
个人:~/.bash_profile
功用:
1.用于定义环境变量
2.运行命令或脚本
2.bashrc类
bashrc类:为非交互式和交互式的登录的shell提供配置
全局:/etc/bashrc
个人:~/.bashrc
功用:
1.定义命令别名的函数
2.定义本地变量
配置文件生效
修改profile和bashrc文件后需要生效有两种方法:
1.重新启用shell进程
2.source| . 配置文件
示例:
. ~/.bashrc
bash退出任务
保存在~/.bash_logout文件中(用户),在退出登录shell时运行
功能:
1.创建自动备份
2.清楚临时文件
流程控制
条件选择
选择执行if语句
格式:
if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi
单分支:
if 条件判断;then
条件为真的分支代码
else
条件为假的分支代码
fi
双分支
if 条件判断1;then
条件1为真的分支代码
elif 条件判断2;then
条件2为真的分支代码
else
条件为假的分支代码
fi
选择执行case语句
格式:
case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
PAT3)
分支3
;;
...
*)
默认分支
;;
esac
case支持glob风格是通配符:
*:任意长度字符串
?:任意单个字符
[ ]:指定范围内的任意单个字符
|:或,如a或b