设为首页 收藏本站
查看: 892|回复: 0

Linux学习之Shell基础

[复制链接]

尚未签到

发表于 2018-8-29 07:54:20 | 显示全部楼层 |阅读模式
  一、Shell概述
  1.Shell概述:
  Shell:壳,Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。类似于翻译,相当windows的操作界面
  Shell同时还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux命令。
  2.Shell的分类:
  Bourne Shell:从1979起Unix就开始使用的Bourne Shell
  Bourne Shell的主文件名为sh
  C Shell:C Shell主要是在BSD版的unix系统中使用,其语法和c语言类似而得名
  Shell主要有两种语法:Bourne和C,这两种语法彼此不兼容。
  Bourne家族主要包括:sh、ksh、Bash(标准Shell)、psh、zsh;
  C家族主要包括:csh、tcsh;主要用于Unix
  Bash:Bash与sh兼容,现在使用的Linux就是使用bash作为用户的基本Shell。
  3.Linux支持的Shell
  保存在/etc/shells目录下
  [root@localhost ~]# vi /etc/shells
  /bin/sh
  /bin/bash
  /sbin/nologin
  /bin/tcsh
  /bin/csh
  [root@localhost ~]# sh
  sh -4.1# exit
  exit
  [root@localhost ~]# csh
  [root@localhost ~]# exit
  exit
  [root@localhost ~]#
  #那么如何判断我们进入的当前shell类型呢,使用echo $SHELL可以查看当前Shell
  [root@localhost ~]# echo $SHELL
  /bin/bash
  父shell:初始时进入的Shell
  子Shell:后面调用的Shell
  二、脚本执行方式
  1.echo输出命令
  echo [选项][输出内容]
  选项:
  -e :支持反斜线控制的字符转换
  控制字符:
  \a    :输出警告音
  \b    :退格键,也就是向左删除键
  \n    :换行符
  \r    :回车键
  \t    :制表符,也就是Tab键
  \v    :垂直制表符
  \0nnn :按照八进制ASCll码表输出字符。其中0为数字0,nnn为三位八进制数
  \xhh  :按照十六进制ASCll码表输出字符。其中hh是两位十六进制数
  [root@localhost ~]# echo "what do you want to do?"
  what do you want to do?
  [root@localhost ~]# echo -e "what do you want to\b do?"
  what do you want t do?
  [root@localhost ~]# echo -e "\x68\t\x65\t\x6c\n\x6c\t\x6f\t"
  #按照十六进制ASCⅡ码也同样可以输出
  h   e   l
  l   o
  #注意,感叹号在echo命令中是有特殊含义的
  [root@localhost ~]# echo -e "\e[1;31m Do you want do \e[0m"
  #输出颜色:
  #30m=黑色,31m=红色,32m=绿色,33m=***
  #34m=蓝色,35m=洋红,36m=青色,37m=白色
  #\e[1;:开启颜色
  #\e[0m:关闭颜色
  2.第一个脚本
  #!/bin/bash
  #The first Shell program
  echo -e "\e[1;34m 天上掉下个林妹妹 \e[0m"
  wq
  [root@localhost ~]# vi hello.sh
  #!/bin/bash标称下面所写的脚本是标准,纯Shell是不会出错,但是调用其他程序时会出错
  #学会写注释
  3.脚本执行
  (1).赋予执行权限,直接运行
  chmod 755 hello.sh
  ./hello.sh  相对路径
  (2).通过Bash调用执行脚本
  bash hello.sh  #用bash直接解释命令
  如果脚本语法有错误可以通过:
  [root@localhost ~]# vim hello.sh进行返回修改
  注意用英文书写符号
  [root@localhost ~]# bash hello.sh
  直接调用,或者:
  [root@localhost ~]# chmod 755 hello.sh
  [root@localhost ~]# ll
  总用量 48
  -rwxr-xr-x. 1 root root 91  7月 28  11:25  hello.sh
  权限变成可执行了
  [root@localhost ~]# ./hello.sh
  天上掉下个林妹妹
  [root@localhost ~]# /root/hello.sh
  天上掉下个林妹妹
  三、Bash的基本功能
  1.命令别名与快捷键
  命令别名==小名,另外一个称呼
  a.有些命令特别长,那么我们可以取个别名,方便操作
  b.操作系统升级后,命令格式发生了变化,那我们可以用旧的得命令去映射新的命令
  (1).alias
  #查看系统中所有的命令别名
  [root@localhost ~]# alias
  alias cp = 'cp -i'
  alias l.= 'ls -d .* --color=auto'
  ...
  (2).alias 别名= ‘原命令’
  #设定命令别名
  [root@localhost ~]# vi /etc/passwd #不支持颜色
  [root@localhost ~]# vim /etc/passwd #支持颜色
  我们可以:
  [root@localhost ~]# alias vi='vim'
  (3).别名永久生效与删除别名
  vi ~/.bashrc
  #写入环境变量配置文件(定义操作环境的配置文件)
  进入到root下的.bashrc即兴配置即可
  alias rm ='rm -i'其中-i就使用询问是否删除的
  (4).unalias 别名
  #删除别名
  (5).命令生效顺序
  第一顺序:执行用绝对路径或相对路径执行的命令
  第二顺序:执行别名
  第三顺序:执行Bash的内部命令,Linux自带的
  第四顺序:执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
  [root@localhost ~]# echo $PATH
  (6).常用快捷键
  Ctrl+c 强制终止当前命令
  Ctrl+l 清屏
  Ctrl+a 光标移动到命令行首
  Ctrl+e 光标移动到命令行行尾
  Ctrl+u 从光标所在位置删除到行首
  Ctrl+z 把命令放到后台
  Ctrl+r 在历时命令中搜索
  [root@localhost ~]# ^c
  2.历史命令
  (1).历史命令
  history [选项][历史命令保存文件]
  选项:
  - c:清空历史命令
  - w:把缓存中的历史命令写入历史命令保存文件 ~/,bash_history
  保存文本其实占用很小
  [root@localhost ~]# ls -alh
  总用量 104K
  -rw-------. 1 root root 7.2K 10月 10  02:27 .bash history
  可以保存起来
  另外:历史命令默认会保存1000挑,可以在环境变量配置文件/etc/profile中进行修改
  [root@localhost ~]# vi /etc/history
  HISTSIZE=1000
  可以直接修改
  (2).历史命令的调用
  使用上、下箭头调用以前的历史命令
  使用"!n"重复执行第n条历史命令
  使用"!!"重复执行上一条命令
  使用"!字符串"重复执行最后一条以该字符串开头的命令
  [root@localhost ~]# history#可以查看所有在有效范围出现了的历史命令记录
  [root@localhost ~]# service network restart
  正在关闭接口eth0:              [确定]
  关闭环回接口:                  [确定]
  弹出环回接口:                  [确定]
  弹出界面 eth0:                 [确定]
  这个时候我们再次使用就可以这样输入命令:
  [root@localhost ~]# !ser
  service network restart
  (3).命令与文件补全
  在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或者文件时,
  按一下"Tab"键会自动补全,如果存在多个相关的命令
  我们可以:按两下"Tab"会弹出提示所有的相关命令
  其实命令补全依赖$PATH命令,文件补全依赖与操作路径
  3.输出重定向
  (1).概述:
  输出重定向和输入重定向:
  把结果写入计算机中叫做输入,把结果显示出来叫做输出
  设备      设备文件名       文件描述符         类型
  键盘      /dev/stdin         0            标准输入
  显示器    /dev/sdtout        1             标准输出
  显示器    /dev/sdterr        2             标准错误输出
  (2).输出重定向:
  类型                    符号                作用
  标准输出重定向          命令>文件        以覆盖的方式,把命令的正确输出输出到指定                                  的文件或设备当中
  命令>>文件        以追加的方式,把命令的正确输出输出到指定                                     的文件或设备当中
  标准错误输出重定向       错误命令2>文件      以覆盖的方式,把命令的错误输出输出到指定                                   的文件或设备当中
  错误命令2>>文件     以追加的方式,把命令的错误输出输出到指定                                   的文件或设备当中
  正确输出和错误输出       命令>文件 2>&1      以覆盖的方式,把命令的正确和错误输出输出                                   同时保存到指定的文件当中
  命令>>文件 2>&1     以追加的方式,把命令的正确和错误输出输出                                   到指定的文件当中
  命令&>文件        以覆盖的方式,把正确输出和错误输出都保存                                   在同一个文件当中
  命令&>>文件       以追加的方式,把命令的正确和错误输出输出                                   到指定的文件当中
  命令>>文件1 2>>文件2   以追加的方式,把命令的正确输出保存到文件                                   1,把错误的输出保存到文件2
  通过输出重定向,把输出结果保存起来,可以实现无人值守
  [root@localhost ~]# ifconfig > test.log
  [root@localhost ~]# cat test.log
  #输出结果:...
  只要命令有输出,都可以保存到指定位置,注意>大于号会覆盖之前的结果,不想覆盖就使用>>,如果目标文件不存在会自动创建。
  如果命令不存在,或者有错误,我们应该用2>或者2>>来保存错误信息,错误信息和正确信息应该用不同的重定向格式,注意>或>>左右两边没有空格
  注意:
  [root@localhost ~]# ls &>/dev/null
  其中/dev/null是一个空,里面的文件会直接删除掉,那么保存的日志将会销毁,找不到了
  作用:在写脚本时,不需要过程,只查看结果
  (3).输入重定向
  [root@localhost ~]# wc [选项][文件名]
  选项:
  -c 统计字节数 count
  -w 统计单词数 word
  -l 统计行数 list
  [root@localhost ~]# wc
  abd
  ert
  #ctrl+d
  2  2   6
  单词之间靠空格来分隔
  命令dy
  4  3 11
  ...
  标识符把标识符之间内容作为命令的输入
  4.管道符
  (1).多命令顺序执行
  多命令执行符      格式           作用
  ;         命令1; 命令2  多个命令顺序执行,命令之间没有任何逻辑联系
  &&         命令1&&命令2   逻辑与(没有数据传递)
  当命令1正确执行,则命令2才会执行
  当命令1执行不正确,则命令2不会执行
  ||         命令1||命令2   逻辑或(没有数据传递)
  当命令1执行不正确时,命令2才会执行
  当命令1正确执行时,命令2不会执行
  注意分号是英文的;
  [root@localhost ~]# ls && echo yes || echo no
  acces.log  ....
  yes
  [root@localhost ~]#  lsa && echo yes || echo no
  -bash: lsa:command not found
  no
  顺序不能颠倒: && echo yes || echo no
  这里的命令1可以有多个命令,如果其中有一个命令执行了,那么命令1就是存在正确,&&会
  执行,||命令2不执行
  [root@localhost ~]#  ls || echo no && echo yes
  yes
  [root@localhost ~]# lsa || echo no && echo yes
  no
  yes
  (2)管道符
  命令格式:
  [root@localhost ~]# 命令1 | 命令2
  #命令1的正确输出作为命令2的操作对象
  例子:
  [root@localhost ~]#  ls -l /etc | more
  把etc的文件分屏显示
  [root@localhost ~]# netstat -an | grep ESTABLISHEN
  tcp   0    52  192.168.0.156:22     192.168.0.155:1459      ESTABLISHEN
  #提取网络监听端口情况
  [root@localhost ~]# netstat -an |  grep ESTABLISHEN  | wc -l
  1 #统计连接结果个数
  5.通配符
  (1).概述:可以用来匹配其他符号的字符
  通配符      作用
  ?         匹配任意一个字符
  *          匹配0个或多个任意字符,也就是可以匹配任意内容
  []         匹配中括号中任意一个字符。例如:[abc]代表一定匹配其中一个字符:a或b
  或c
  [-]        匹配中括号中任意一个字符,-代表一个范围,例如:[a-z]代表从a-z的一个
  小写字母
  [^]        逻辑非,表示匹配不是中括号内的一个字符。例如:[^0-9]代表匹配的不是一
  个数字的字符
  注:除了*可以匹配多个字符,其他一次只能匹配一个
  例子:
  [root@localhost ~]# mkdir dy
  [root@localhost ~]# cd /root/dy
  [root@localhost dy]# pwd
  /root/dy
  [root@localhost dy]# touch dzp
  [root@localhost dy]# touch dzp2
  [root@localhost dy]# touch dzp3
  [root@localhost dy]# touch dzp34
  [root@localhost dy]# touch dzpcang
  [root@localhost dy]# touch dzpbols
  [root@localhost dy]# touch dzpa
  [root@localhost dy]# ls
  dzp  dzp2  dzp3  dzp34  dzpcang  dzpbols
  [root@localhost dy]# ls dzp
  dzp
  [root@localhost dy]# ls dzp*
  dzp  dzp2  dzp3  dzp34  dzpcang  dzpbols
  [root@localhost dy]# ls dzp?
  dzp2  dzp3
  [root@localhost dy]# ls dzp[0-9]
  dzp2  dzp3
  [root@localhost dy]# ls dzp[0-9][0-9]
  dzp34
  [root@localhost dy]# ls dzp[^0-9]
  dzpa
  注:通配符主要用来匹配文件名或者文件目录,如果要匹配文件内容,需要用到正则表达式
  (3).Bash中其他特殊符号:
  符号                             作用
  ''        单引号,在单引号中所有的特殊符号,如“$”和“`”和“\”都没有特殊含义
  ""        双引号。在双引号中特殊符号都没有特殊含义,但是“$”和“`”和“\”例外
  拥有“调用变量的值”,“引用命令”和“转义符”的特殊含义
  ``        反引号。反引号括起来的内容是系统命令,在Bash中会先执行它,和$()作用一
  样,不过推荐使用$(),反引号容易看错
  $()       和反引号作用一样,用来引用系统命令
  #         在shell脚本中,#开头的行代表注释
  $         用于调用变量的值,如需要调用变量name的值时,需要使用$name的方式得到变
  量的值
  \         转义符,跟在\之后的特殊符号都将失去意义,变成普通字符,如\$将输出“$
  ”符号,而不是当作变量引用
  [root@localhost dy]# a=123
  [root@localhost dy]# echo $a
  123
  [root@localhost dy]# echo '$a'
  $a
  [root@localhost dy]# echo "$a"
  123
  [root@localhost dy]# a=ls
  [root@localhost dy]# echo "$a"
  ls
  [root@localhost dy]# a=`ls`
  [root@localhost dy]# echo "$a"
  dzp
  dzp2
  dzp3
  dzp34
  dzpcang
  dzpbols
  dzpa
  一般不是用``容易和''单引号混淆,我们可以使用$()


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-557920-1-1.html 上篇帖子: shell脚本进行数据库操作 下篇帖子: 【Linux】Shell中的正则表达式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表