shell基础
shell介绍
- shell是一个命令解释器,提供用户和机器之间的交互
- 支持特定语法,比如循环、判断
- 每个用户都可以有自己特定的shell
- CentOS7默认shell为bash(Bourne Agin Shell)
- 还有zsh、ksh等
命令历史
history命令
root用户使用过的命令存放在/root/.bash_history,最多存放1000条。
history -c 清空内存中的历史命令
由系统变量$HISTSIZE控制,在/etc/profie中配置,修改之后重新连接终端或者输入source /etc/profile 生效
记录命令执行的时间
HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S ",当前连接生效。
写入/etc/profile中,放在HISTSIZE下,重新连接终端或者输入source /etc/profile 生效。
保存所有输入过的命令 chattr +a ~/.bash_history 使该文件只能追加内容
!! 上一条命令
!n 运行第n条命令
!echo 最近运行的echo命令
命令补全和别名
tab
如果与输入的部分相同的命只有一个按一下tab会自动补全,如果有多个,按两下tab会列出有哪些命令
CentOS 7中支持参数自动补齐,需安装bash-completion并重启之后生效。
yum -install -y bash-completion 自动补全参数
我们可以通过起别名的方式让长度很长的命令使用起来更方便
alias restartnet=‘systemctl restart network.service’ 给命令起别名
alias 查看哪些命令有别名
unalias restartnet 取消别名
别名存放在用户家目录下的 .bashrc和/etc/profile.d目录下的colorgrep.sh和colorls.sh中
通配符
通配符 * 表示零个或多个字符,前后都可以
通配符? 表示一个任意的字符
[0-9] 括号中列出范围,等同于[0123456789],
[0-1a-b] 等同于[01ab],满足范围中一个
{1,2}括号中列出范围,满足范围中的一个
输入输出重定向
表示前面命令正确的输出输入到后面的文件中,删除之前的内容重写
表示前面命令正确的输出输入到后面的文件中,追加内容
2> 表示前面命令错误的输出输入到后面的文件中,删除之前的内容重写
2>> 表示前面命令错误的输出输入到后面的文件中,追加内容
&> 表示前面命令正确和错误的输出都输入到后面的文件中,删除之前的内容重写
&>> 表示前面命令正确和错误的输出都输入到后面的文件中,追加内容
ls [12].txt aaa.txt >3.txt 2>4.txt 将正确和错误的输出分别写入到不同的文件中
wc -l < 1.txt
管道符、作业控制
| 把前面命令输出的内容传递给后面的命令
cat 1.txt |grep ‘aaa’ 输出1.txt的内容过滤出只含有aaa内容
crrl z 暂停一个正在执行的任务并放到后台
fg 把暂停的任务调回前台
bg 把任务放到后台,且实运行中
fg id 调回指定的任务
jobs 查看后台的任务
sleep 200 & 将命令sleep 200放在后台运行
shell变量
env 查看系统变量
set 查看用户自定义变量和系统变量
自定义变量
变量规则:
字母、数字和下划线,首位不能为数字
变量值有特殊符号时需要用单引号括起来,duo=‘duo duo’
a=a’$ b’用’ ‘时,$b会被认为是字符,如果不使用’ ‘,会被认为是变量
单引号将其中的内容都作为了字符串来,忽略所有的命令和特殊字符,类似于一个字符串的用法
双引号与单引号的区别在于其可以包含特殊字符,包括’, ", $, ,如果要忽略特殊字符,就可以利用\来转义,忽略特殊字符,作为普通字符输
出变量的累加
pstree 查看当前登录
yum install -y psmisc 安装pstree命令
当打开多个变量,使用echo $SSH_TTY,可以查看所在终端
全局变量export tx=‘tang xiang’,针对当前连接的终端向下生效,在其他登陆的终端不生效。父shell会同步到子shell,子shell不同步到父shell。
unset 变量名 取消变量
环境变量配置文件
环境变量配置文件分为:系统层次和用户层次
系统层次配置文件
/etc/profile 用户环境变量,用户登陆时加载profile
/etc/bashrc 用户不用登陆,执行shell脚本时调用当中的配置
用户层次配置文件
~/.bashrc
~/.bash_profile
~/.bash_history 记录历史命令
~/.bash_logout 定义用户退出时需要做的操作
变量PS1
[root@linux-01 ~]# echo $PS1
[\u@\h \W]$,当改为w时,显示的是绝对路径
课堂笔记
bashrc和bash_profile
http://ask.apelearn.com/question/7719
bash_profile跟用户登陆相关,用户登陆生效
bashrc 执行shell就会生效,不一定需要用户登陆。
.bash_profile是用户家目录下的
/etc/bash_profilr是针对所有用户的
echo显示颜色http://www.cnblogs.com/lr-ting/archive/2013/02/28/2936792.html
需要琢磨的点
使用source不会产生新的bash,会把子脚本里变的变量带回父脚本
exec无法把子脚本里变的变量带回父脚本
cat 2.sh
#!/bin/bash
echo “children script PID is $
"
e
c
h
o
"
n
o
w
t
o
c
h
i
l
d
r
e
n
s
c
r
i
p
t
.
"
e
x
p
o
r
t
a
=
2
e
c
h
o
"
i
n
c
h
i
l
d
r
e
n
,
a
=
" echo "now to children script." export a=2 echo "in children, a=
"echo"nowtochildrenscript."exporta=2echo"inchildren,a=a”
cat source.sh
#!/bin/bash
echo “fater script PID is $$”
echo “fater script, set a is 1”
export a=1
echo “it will source ./2.sh”
source ./2.sh
echo “now to father script.”
echo “fater script, a is $a”
cat exec.sh
#!/bin/bash
echo “fater script PID is $$”
echo “fater script, set a is 1”
export a=1
echo “it will exec ./2.sh”
exec ./2.sh
echo “fater script, a is $a”
sort未按ASCII排序
LC_ALL=C
搜索某个命令的安装包
yum provides “/*/*bin/vim”