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

了解bash shell及其基本使用

[复制链接]

尚未签到

发表于 2018-8-24 06:54:08 | 显示全部楼层 |阅读模式
  一、linux命令解释器
  linux中命令的执行依赖于shell解释器,shell是用户与操作系统之间的接口,它解释用户输入的命令并将其送入内核。常见的shell有bash(linux系统默认shell),csh,ksh等。shell也是一种特殊的程序,例如bash,其二进制程序文件为/bin/bash
  1、查看当前使用的shell类型:echo $SHELL
  2、改变用户登录时使用的shell,可使用chsh命令
  用法:chsh [选项] [参数]
  常用选项:
  -s:指定用户登录的shell(需为完整路径名,如/bin/csh)
  -l:列出当前系统可用的shell
  例如:chsh -s /bin/csh
  二、linux命令类型
  根据linux命令与shell的关系,可将命令分为两类:
  1、内置命令:是shell内置的一些特殊指令,没有单独的对应的系统文件,随着解释器被自动载入内存,直接供用户使用
  2、外部命令:本身是一个独立的可执行文件,命令名即为程序文件名
  要查看命令的类型,可使用type命令:内置命令会显示为builtin,外部命令会显示其绝对路径)
  用法:type [option]... command
  常用选项:
  -a:显示该命令所有可能的信息,包括alias
  -p:后面接的命令与外部命令时,才会显示完整路径
  -t:输出“file”、“alias”或者“builtin”,分别表示给定的命令为“外部指令”、“命令别名”或者“内部指令”
[root@localhost ~]# type cd  
cd is a shell builtin
  
[root@localhost ~]# type -a ls
  
ls is aliased to `ls --color=auto'
  
ls is /bin/ls
  三、bash变量
  变量实质上是有名称的内存空间
  1、bash变量的类别
  1)本地变量:只对当前shell进程有效,对其它shell进程(包括当前shell进程的子进程)无效
  2)环境变量对当前shell及其子进程有效,对其它shell进程无效,通常是shell内置的一些变量(如PATH,HISTSIZE,LANG,RANDOM,SHELL等)及通过export命令导出的变量,要查看当前shell进程的所有环境变量,可直接使用export,env,printenv命令
  3)局部变量:对shell脚本中某代码片断有效,通常用于函数本地,local VAR_NAME=VALUE
  4)只读变量:readonly var_name
  5)位置变量:如$1(第一个参数),$2...
  6)特殊变量:
  $?:上条命令的状态返回值,主要用于判断程序或脚本是否执行成功,0表示成功,1-255表示失败
  $#:参数的个数
  $*:参数列表
  $0:命令或脚本本身
  $$:脚本所有进程ID
  $@:和 $* 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数
  2、变量类型:
  分为字符型(默认)和数值型,变量类型决定了变量的存储机制、存储空间、参与的运算方式
  3、除了shell内置的环境变量,我们也可自定义变量,直接用ValriablName=VALUE(注意:与其它编程语言不同,shell中变量赋值时,等号两边不能有空格)的方式即可,如pretty=beauty
  4、查看所有变量(包括环境变量和自定义变量):set
  另外,set命令可设置bash的某些特性:
  set -C:指定不覆盖已存在的文件   set +C:指定可覆盖已存在的文件
  5、要获取某个变量的值,可使用echo $变量名,如echo $PATH
  6、取消变量的值unset 变量名,如unset pretty
  7、变量设定的几个重要规则:
  1)变量名只能是英文和数字和下划线,且不能使用程序中的关键字,不能以数字开头,如2mouse=bro 错误。应尽量做到见名知义
  2)变量名中若包含空格,需要使用引号(或转义字符/),但单双引号的功能是有区别的:
  双引号:弱引用,双引号内若包含变量,会被替换,如echo "I love my $HOME"会显示为I love my /home/tesla
  单引号:强引用,引号中的内容会直接显示,echo "I love my $HOME"会显示为I love my $HOME
  3)使用转义字符\将特殊字符(如空格、ENTER、$、'等)变成一般字符
  如name=bluce\ lee  echo $name结果为bluce lee
  4)扩增变量内容
  变量名="$变量名"新增内容,例如PATH="$PATH":/usr/loca/mysql/bin
  5)使用export命令将自定义变量(包括被修改的原环境变量)转为环境变量
  export 变量名,如export LANG=en(表示使用英文编码,通常用于临时解决乱码问题)
  8、PATH环境变量
  当我们执行外部命令时,系统是透过shell内置的PATH环境变量所定义的路径中从左往右依次寻找的,这就是为何我们很多时候只需输入命令名而非其绝对路径的原因,而且我们可以自由地将某个命令的路径添加进PATH变量中,由此给工作带来了很大便利
  更改PATH环境变量的方法
  1)直接使用export命令,如export PATH="$PATH:/usr/loca/mysql/bin",该设置会在终端断开后失效,若要持久有效,需修改/etc/profile
  2)编辑/etc/profile文件或/etc/profile.d/*.sh,在文档最后添加export PATH="$PATH:新增内容",保存退出,然后重新读取该文件(. filesource file),该设置对全局有效
  9、设置命令提示符
  bash命令提示符即命令行窗口起头的那一段,如[root@localhost ~]#,是透过shell内置的变量PS1显示的。PS1可用到的一些符号意义说明:
  \u:当前用户的名称
  \d:可显示出“星期 月 日”的日期格式
  \H:完整的主机名称,如web.diaozt.com
  \h:仅取主机名称的第一小段,如web
  \t:显示精确到秒的24小时格式的时间,如15:20:10
  \T:显示精确到秒 的12小时格式的时间,如09:20:10
  \@:显示时间,为12小时格式的AM/PM样式,如06:22 AM
  \w:完整的工作目录名,家目录为以~取代,如 /home/tesla/test
  \W:路径的基名,即以basename命令取得的名称,如test
  \$:提示字符,root用户初始时为#,其它为$
[root@localhost test]# echo $PS1  
[\u@\h \W]\$
  
[root@localhost test]# export PS1="[\u@\H \@ \w]\$ "
  
[root@localhost.localdomain 06:45 AM /home/tesla/test]$
  10、通过键盘读取变量的值
  使用read命令可从键盘读取变量的值,可同时读取多个变量的值,输入时以空格隔开,该命令常用于bash脚本中
  用法:read [option]... variable...
  选项:
  -p:指定读取值时的提示符
  -t:指定读取值时的等待时间
  例 read -p "Please input two words:" -t 5 a1 a2
  四、命令历史
  history命令用来显示命令历史
  用法:
  直接使用该命令显示所有历史命令
  history N:显示最近N条命令(包括当前history命令自身)
  history -d 命令编号 :删除指定命令条目
  history -a [/path/to/some_history_file]:将当前会话的命令历史写入指定文件
  与命令历史相关的几个环境变量:
  history -c:清空命令历史
  HISTFILE:用户退出时命令历史的持久保存位置,默认为~/.bash_history
  HISTFILESIZE:命令历史文件所能记录的最大条目数
  HISTSIZE:history所能显示的命令历史的最大条目数
  在我们登出bash时,我们下达过的命令的历史默认为会被保存至用户家目录的~/.bash_history文件中,每次登录bash时,系统会自动读取该文件,这就是为何使用history命令还能看到以前bash进程中命令历史的原因。那么~/.bash_history会记录多少条历史条目呢?这个数据保存于环境变量HISTFILESIZE中,默认为1000。当命令历史条目超过该数值时,旧的记录会被冲掉。区别于HISTFILESIZE,HISTSIZE变量保存的是history的条目数
  使用命令历史可简化命令的操作:
  !N:执行命令历史中的第N条命令
  !!:执行上一个命令
  !string:执行命令历史中最近一次以string开头的命令
  !$(加在命令command后):调用上一个命令的最后一个参数
  command后按ESC松开然后按【.】:功能同!$
[root@localhost tesla]# ls /home/tesla  
inittab  iron  test
  
[root@localhost tesla]# ls !$
  
ls /home/tesla
  
inittab  iron  test
  
[root@localhost tesla]# !!
  
ls /home/tesla
  
inittab  iron  test
  
[root@localhost tesla]# date
  
Tue Aug 11 13:05:30 CST 2015
  
[root@localhost tesla]# !d
  
date
  
Tue Aug 11 13:05:34 CST 2015
  
[root@localhost tesla]#
  五、命令别名
  有时要输入一长串的命令比较麻烦,可使用alias命令指定其为一个较短的别名
  用法:
  不带任何参数则直接显示所有已定义的别名
  指定别名:alias name(别名)=value(原命令),如alias rm='rm -i',alias ls='ls --color=auto'
  若别名与原命令相同,而想执行原命令,可使用绝对路径或\command
  撤消指定别名:unalias name
  撤消所有别名:unalias -a
  注意:命令行中定义的别名,其生效范围为当前会话,若要定义的别名持久有效,可将其写入/etc/bashrc(或~./bashrc)文件。例如echo "alias dt=date" >> /etc/bashrc
[root@localhost tesla]# alias  
alias cp='cp -i'
  
alias l.='ls -d .* --color=auto'
  
alias ll='ls -l --color=auto'
  
alias ls='ls --color=auto'
  
alias mv='mv -i'
  
alias rm='rm -i'
  
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
  
[root@localhost tesla]# date
  
Tue Aug 11 13:00:47 CST 2015
  
[root@localhost tesla]# alias dt=date
  
[root@localhost tesla]# dt
  
Tue Aug 11 13:01:04 CST 2015
  
[root@localhost tesla]# unalias dt
  
[root@localhost tesla]# dt
  
-bash: dt: command not found
  
[root@localhost tesla]
  六、如何获取命令帮助?

  •   内部命令:command help
  •   外部命令:
  1、command --help
  2、手册manual(简写为man):man [章节] COMMAND,例如man ifconfig
  ①手册有章节之分(1-9),一个命令可能存在于多个章节中,可使用whatis COMMAND查看一个命令执行什么功能及其手册存在于哪些章节中。whatis命令相当于man -f
  ②帮助中的格式字串:[ ]表示可省略    < >表示不可省略    |表示二选一或多选一   ……表示同类内容可以出现多个
  ③在man中翻屏
  空格键:向文件尾部翻一屏,b:向文件首部翻一屏,回车键:向文件尾部翻一行,k:向文件首部翻一行,ctrl+d:向文件尾部翻半屏,ctrl+u:向文件首部翻半屏
  ④在man中也可搜索字串,方法同vim中字串搜索
  ⑤man能够为除命令之外的配置文件、系统调用、库调用等提供帮助手册,它们分别位于不同的章节中   1:用户命令  2:系统调用  3:库调用  4:设备文件  5:配置文件  6:游戏  7:杂项  8:管理命令
  3、info命令:获取在线文档,仅在man手册无法获取到足够信息,或想了解程序的开发历史时才使用
  七、命令的搜索顺序
  1、以绝对/相对路径执行命令
  2、由alias找到该命令来执行
  3、作为bash内置命令来执行
  4、通过PATH环境变量搜索到的第一个命令执行
  例如,ls的别名与其自身名称相同,由于alias优先于搜索PATH,所以我们使用ls实际是执行其别名命令,即ls --color=auto,若要执行原命令,则使用绝对路径/bin/ls
  八、bash快捷键
  ctrl+a:跳至行首(或home键)  ctrl+e:跳至行尾(或end键)
  ctrl+u:删除命令行首至当前光标处的所有内容
  ctrl+k:删除当前光标处至命令行尾的所有内容
  ctrl+l:清屏(或clear)
  ctrl+c:中止或取消
  ctrl+z:将当前命令送至后台执行
  九、bash重要特性之命令(或路径)补全
  如果用户指定的开头字符串能惟一标识某命令(或路径),则按tab键能补全该命令,否则,再次tab键可显示所有以指定字符开头的命令
  十、shell特殊符
  单引号' '(硬引用)、双引号" "(软引用)和转义符【\】,这三种字符前面已作说明,此处不再赘述
  十一、shell登录类型
  交互式(login shell):
  1)直接通过终端输入帐号和密码登录的
  2)使用su -l username 或 su - username登录的
  非交互式(non-login shell):
  1)su username
  2)图形界面下打开的终端
  3)执行脚本
  十二、bash配置文件

  •   分为两类:
  profile类:为交互式登录的用户提供配置
  全局:/etc/profile,/etc/profile.d/*.sh
  用户:~/.bash_profile
  功用:1、设定环境变量  2、运行命令或脚本
  bashrc类:为非交互式的用户提供配置
  全局:/etc/bashrc
  用户:~/.bashrc
  功用:1、设定本地变量   2、定义命令别名

  •   /etc/profile文件说明:
  每个交互式登录用户在取得bash时都会读取该文件,该配置文件根据用户的UID来设定很多变量的值,如PATH,MAIL,MAIL,HOSTNAME,USER以及umask值

  •   通过编辑配置文件修改的配置如何生效?
  1、退出并重新登录   2、让bash重读此配置文件( . file或source file)

  •   bash配置文件的读取顺序:
  ①交互式登录用户:             /etc/profile→/etc/profile.d/*.sh→~/.bash_profile→~/.bashrc→/etc/bashrc
  交互式登录用户读取的配置文件其实只有/etc/profile,但此文件会呼叫其它配置文件
  ②非交互式登录用户:~/.bashrc→/etc/bashrc→/etc/profile.d/*.sh
  十三、几个重要命令
  1、exec:用于调用并执行指定的命令。
  我们知道,在bash shell进程中执行命令即开启了一个子进程,该子进程终止后又回到父进程;而exec会启动command为一个进程,此进程会取代当前shell进程,指定的命令结束后会立即退出终端
  用法:exec COMMAND
[root@node2 ~]# su - tesla  
[tesla@node2 ~]$ exec mail   #查看邮箱后自动退出当前shell进程
  
No mail for tesla
  
[root@node2 ~]# exec echo "See you later"
  
See you later
  

  
Connection closed by foreign host.
  

  
Disconnected from remote host(192.168.30.20:22) at 20:13:27.
  

  
Type `help' to learn how to use Xshell prompt.
  
[c:\~]$
  2、screen
  想象一种场景,当我们远程登录linux,运行一些程序(如下载),如果这些程序需要运行很长时间,而程序运行过程中出现网络故障导致连接中断,则远程服务器上没有正常结束的命令将被迫中止。而scree工具就能很好地避免这种问题
  screen:用户可以通过该工具同时连接多个本地或远程的的命令行会话,并在其间自由切换
  在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存,用户可以通过快捷键在不同的窗口下切换。只要Screen本身没有终止,在其内部运行的会话都可以恢复
  用法:
  screen:启动新屏幕,默认是attached模式,即建好之后就连上去
  screen -S NAME:启动一个带名称的新屏幕
  screen -dm [NAME]:以detached模式启动一个新屏幕,也即建好之后不会连上去
  screen -ls:查看所有被隐藏的屏幕ID
  exit:退出新屏幕(关闭)
  Ctrl+a,d(detach):拆除新屏幕(临时隐藏)
  screen -r SID:恢复某隐藏的屏幕;若屏幕只有一个,SID可省略
  screen -d -r SID:拆除当前屏幕并恢复到指定屏幕
  Ctrl+a,n(next):下一个屏幕
  Ctrl+a,p(previous):上一个屏幕



运维网声明 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-555672-1-1.html 上篇帖子: 6_Shell语言———grep命令 下篇帖子: linux shell中的位置参数变量
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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