码迷,mamicode.com
首页 > 系统相关 > 详细

shell基础知识

时间:2018-05-30 01:26:53      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:shell

Shell


shell是一个命令解释器,提供用户和机器之间的交互

支持特定语法,比如逻辑判断、循环

每个用户都可以有自己特定的shell

CentOS7默认shell为bash(Bourne Agin Shell)

还有zsh、ksh等


命令历史

history 最多可以存一千条,如果不正常退出(exit,logout)命令历史保存的就不会完整的保存

文件路径:ls /root/.bash_history#cat /root/.bash_history

由echo $HISTSIZE  环境变量配置规定

技术分享图片

如何修改这个数值编辑它的配置文件,vi /etc/profile,/搜到HISTSIZ它可以修改,必须退出终端或者输入命令source /etc/profile才会生效

history -c #可以把当前内存里的命令历史的缓存清空,但并不会删除存命令的配置文件

history 仅仅是显示的命令的ld,如何记录一条命令它是什么时间运行的,可以运行这条命令:HISTTIM EFORMAT= "%Y/%m/%d %H:%M:%S "   但只是在当前终端生效

永久生效需要编辑配置文件:vim /etc/profile

/搜索一下HISTSIZE

把命令HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "放到那,如下图

技术分享图片

source /etc/profile#生效

chattr +a ~/.bash_history #永久保存命令历史,不让别人删除

!!     #两个叹号意思是上一条命令,命令历史最后一条命令


!n      #运行指定的命令,n表示数字,假如说我想运行第936条命令

  936  ls
  937  yum history
  938  history
  939  echo $HISTSIZ
  940  echo $HISTSIZE
  941  logout
  942  exit
  943  history 
[root@aaa-01 ~]# !936
ls
111  1_heard.txt  1.txt.xz  2.txt  2.txt.xz  999  9.txt  anaconda-ks.cfg  a.txt


!echo  #在命令历史里边倒着找第一个以echo开头的命令,正好是940条

  940  echo $HISTSIZE
  941  logout
  942  exit
  943  history 
  944  ls
  945  echo $HISTSIZE 
  946  history 
[root@aaa-01 ~]# !echo 
echo $HISTSIZE  
1000


命令补全和别名

tab键,敲一下,敲两下

命令、参数补全需要先安装:yum install -y bash-completion

重启生效:reboot

 

alias别名给命令重新起个名字,例如你把重启网络服务的命令定义成restartnet

技术分享图片

技术分享图片


取消别名:unalias 加定义的别名

技术分享图片


alias在哪里定义的?

第一个地方是用户的家目录下~/.bashrc文件

第二个是: ls /etc/profile.d/

技术分享图片

技术分享图片 


自定义的alias放到~/.bashrc

reboot重启一下

alias别名给命令重新起个名字


通配符

· Is *.txt  以.txt结尾的文件

[root@aaa-01 ~]# ls *.txt
1_heard.txt  2.txt  9.txt  a.txt
[root@aaa-01 ~]# ls *txt
1_heard.txt  2.txt  9.txt  a.txt
[root@aaa-01 ~]# ls *txt*
1_heard.txt  1.txt.xz  2.txt  2.txt.xz  9.txt  a.txt
[root@aaa-01 ~]# ls 1*
1_heard.txt  1.txt.xz

111:
yum.log

技术分享图片


· Is ?.txt 一个任意的字符,bb就不行,

技术分享图片


· Is [0-9].txt 0到9范围内的,[23]就是2和3,2或者3,有一个3也行,有一个2也行,两者有一个满足就行

技术分享图片

或者:ls [a-z].txt  ls [A-Z].txt  ls [0-9a-zA-Z].txt

[root@aaa-01 ~]# ls [a-z].txt
a.txt
[root@aaa-01 ~]# ls [A-Z].txt
ls: 无法访问[A-Z].txt: 没有那个文件或目录
[root@aaa-01 ~]#  ls [0-9a-zA-Z].txt
2.txt  9.txt  a.txt
[root@aaa-01 ~]#


· Is {1,2}.txt  这个范围当中的一个“或”的意思

技术分享图片

[root@aaa-01 ~]#  ls {2,a}.txt
2.txt  a.txt
[root@aaa-01 ~]# 
[root@aaa-01 ~]#  ls {2,a,3,9}.txt
ls: 无法访问3.txt: 没有那个文件或目录
2.txt  9.txt  a.txt



输出重定向

>解释:重定向的意思,把前面这个文件的输出结果直接输入到后边这个文件里边去,

· cat 1 .txt > 2.txt  把1.txt里的内容重定向到2.txt里边去,>它会把文件内容删除掉重写

技术分享图片

>>追加的意思,它不会把你原来的内容删除,例如cat 1.txt >> 2.txt ,把1.txt的内容追加到2.txt中


2>解释:错误重定向它会把命令产生的错误信息指定输出到文件里去

例如输入错误命令Isaaa,然后把它的结果输入到a.txt

[root@aaa-01 ~]# lsaaa 2> a.txt
[root@aaa-01 ~]# cat a.txt
-bash: lsaaa: 未找到命令
[root@aaa-01 ~]#


2>>错误追加重定向

[root@aaa-01 ~]# lsaaa 2>> a.txt
[root@aaa-01 ~]# cat a.txt 
-bash: lsaaa: 未找到命令
-bash: lsaaa: 未找到命令
[root@aaa-01 ~]#


正确和错误也可以一起使用

技术分享图片

&>正确的和错误的结合

技术分享图片


输入重定向

<解释:输入重定向,把右边的一个文件或者文件的内容输入到左边的一个命令里边去,左边只能是命令不能是文件

例如:wc -l < a.txt,意思是查看a.txt的行数 ,或者查看a.txt的大小du -sh < a.txt

技术分享图片


管道符

管道符:把一个文件的输出的内容传递给后边的命令

例如:查看1.txt有多少行cat 1.txt |wc -l ;    cat 1.txt |grep 'aaa' 首先把1.txt的内容输出出来,再交给后边的命令。grep过滤指定关键词的命令,只要含有aaa的都过滤出来

[root@aaa-01 ~]# cat 1.txt |wc -l
5
[root@aaa-01 ~]# cat 1.txt |grep 'aaa'
aaa


作业控制

ctrl+z  #暂停一个任务  fg  #调回来     假如说你在编辑1.txt文件突然想查看一下当前目录下的东西

[root@aaa-01 ~]# vim 1.txt

[1]+  已停止               vim 1.txt
[root@aaa-01 ~]# ls
111          1.txt     2.txt     999    anaconda-ks.cfg
1_heard.txt  1.txt.xz  2.txt.xz  9.txt  a.txt
[root@aaa-01 ~]# fg

ctrl+z  #支持停止多个任务

技术分享图片


jobs查看后台的任务

[root@aaa-01 ~]# jobs
[1]-  已停止               vim 1.txt
[2]+  已停止               vim a.txt


bg[id]把任务调到后台,并且运行,直接bg执行的是最后的任务

技术分享图片 

如果他是动态的任务,他的输出还会在屏幕上显示,但是你可以输命令


fg[id]把任务调到前台

[root@aaa-01 ~]# jobs
[1]   运行中               sleep 200 &
[2]-  已停止               sleep 100
[3]+  已停止               sleep 300
[root@aaa-01 ~]# fg 3
sleep 300


sleep 100 停止100秒什么都不干 

技术分享图片


命令后面加&直接丢到后台运行

技术分享图片


变量

PATH,HOME,PWD,LOGNAME


 env命令可以获取到系统的常用变量,=等号左边是变量的名字(变量名=变量),系统的变量通常都是大写的字母,变量的值就不一定了,可能是字母可能是字符串,可能是数字 

[root@aaa-01 ~]# env
XDG_SESSION_ID=1
HOSTNAME=aaa-01
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.232.1 55022 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=root


set命令也可以查看变量,不仅查看系统变量还可以查看用户自定义的变量,

 自定义变量例如a=111,但他不是系统变量只是用户自定义的变量,只能在set查看的变量里找到在env里找不到

[root@aaa-01 ~]# a=111
[root@aaa-01 ~]# echo $a
111

 

变量名规则:字母、数字下划线,首位不能为数字

[root@aaa-01 ~]# a1=2
[root@aaa-01 ~]# a_1=3
[root@aaa-01 ~]# _a1=4
[root@aaa-01 ~]# echo $a1
2
[root@aaa-01 ~]# echo $a_1
3
[root@aaa-01 ~]# echo $_a1
4
                           #首位是数字就会报错
[root@aaa-01 ~]# 1aa=2
-bash: 1aa=2: 未找到命令
[root@aaa-01 ~]# 2aa=3
-bash: 2aa=3: 未找到命令

 

变量值有特殊符号时需要用单引号括起来

[root@aaa-01 ~]# a=a b c
-bash: b: 未找到命令
[root@aaa-01 ~]# a='a b c'
[root@aaa-01 ~]# echo $a
a b c


 

变量的累加用$

[root@aaa-01 ~]# a='a$bc'
[root@aaa-01 ~]# b='1$23'
[root@aaa-01 ~]# echo $a$b
a$bc1$23

自定义成多个变量组成的变量时用“”双引号,单引号识别不出来

[root@aaa-01 ~]# a=123
[root@aaa-01 ~]# b=bc
[root@aaa-01 ~]# c='$a$b'
[root@aaa-01 ~]# echo $c
$a$b
[root@aaa-01 ~]# c="$a$b"
[root@aaa-01 ~]# echo $c
123bc

或者把变量单独引起来“”

[root@aaa-01 ~]# b=bc
[root@aaa-01 ~]# c=a"$b"c
[root@aaa-01 ~]# echo $c
abcc

还可以这么写,根据上边定义好的ab变量,在单独想加个c

[root@aaa-01 ~]# c="$a$b"c
[root@aaa-01 ~]# echo $c
a$bc1$23c


自定义的变量只能在当前终端生效,新打开的不会生效

技术分享图片 


全局变量

sshd——sshd——bash——pstree #我们远程登录sshd通过与sshd获得了一个bash,然后我们又在这个终端下运行了一个bash

技术分享图片

当我们在登录一个子shell的时候发现他不能获得自定义变量的值了,这叫做非全局变量或者叫做本地变量仅仅在你终端下生效

技术分享图片

如何把它设置成全局变量用命令:export b=2,这样不管你在子目录下还是子子目录下都会生效

技术分享图片

但是新打开一个终端还是不会生效因为他们的sshd为并列关系

技术分享图片


它所谓的全局变量指的是向下的,在你这个shell的基础上去生成子shell子子shell的时候定义的全局变量才会生效

但是你在子shell中定义了一个全局变量,然后往上退一级到shell下来时就不生效了,全局变量是不会向上全局的

技术分享图片

 

unset  #取消自定义变量,后边跟变量名

技术分享图片


环境变量配置文件

/etc/profile 用户环境变量,交互,登录才执行

 /etc/bashrc 用户不用登录,执行shell就生效

 ~/.bashrc

 ~/.bash_profile

 ~/.bash_history

 ~/.bash_logout

 PS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\w\[\033[00m\]\$ '


shell基础知识

标签:shell

原文地址:http://blog.51cto.com/12922638/2121838

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!