1、shell概述
shell叫做命令解释器,通过shell将linux的命令翻译成内核可以看的懂的二进制语言。
shell分类如下,我们主要使用bash这种shell脚本语言:
可以通过vim /etc/shells查看可以支持的脚本语言类型:
2、shell脚本语言执行方式
echo命令:
echo [选项] [输出内容]
选项:
-e:支持反斜线控制的字符转换;
-n:取消输出后行末换行符号;
echo命令中若使用“- e”选项,则可以支持控制字符,如下表:
shell脚本执行:
a.编写方式如下:
[root@jone ~]# vim helloworld.sh
#!/bin/bash
echo "1111111! "
b.赋予执行权限,添加755权限即可;
c.执行方式:(1)相对路径进行执行;(2)绝对路径进行执行;(3)调用bash执行脚本;一般推荐第二种方式。
bash基本功能:
历史命令查看:
history [选项] [历史命令保存文件]
选项:
-c:清空历史命令
-w:把缓存中的历史命令写入文件,默认放在用户目录下的.bash_history中;
注意:可以通过修改/etc/profile文件来扩容历史命令存放的条目
历史命令的调用:(标红的常用)
关闭linux的命令告警声音:(取消掉下面红框中的注释即可,重启生效)
命令别名:
alias:查询已经设定的别名;
alias 别名='原命令'
可以通过修改/root/.bashrc环境变量,让别名永久生效:
bash常用快捷键:
常用的快捷键如下表中所示,红框中为常用功能快捷键,注意ctrl+z并不是退出程序,而是暂停并放入后台。
输入输出重定向:
bash的标准输入输出:
输出重定向:标红框的最为常用
输入重定向(用的很少):
wc [选项] [文件名]
选项:
-c:统计字节数;
-w:统计单词数;
-l:统计行数;
多命令顺序执行:
举例:ls && echo yes || echo no。该种方法可以作为一个判断,假如命令执行失败输出no,执行成功输出yes。
管道提取grep、管道符、通配符,前面已讲解过,不再叙述;
BASH中其他特殊符号:
()与{ }用的较少,其他都较为常用
备注:对于()内子shell执行产生的结果不会影响父shell内的变量;
3、变量和运算符
shell环境中变量的类型都是字符串类型,如果需要进行数值运算则必须要单独指定变量为数值类型。定义变量时若字符串中有空格等符号需要用双冒号""进行括起来,其中\、$都是具有特殊意义的转义字符,在""内需要用\进行说明,''单引号内则表示普通字符。变量名称不能以数字开头,由字母/下划线/数字组成,且=两边不能有空格。
linux变量分类:
- 用户自定义变量:名称-自定义,作用-自定义,内容-自定义;
- 环境变量(建议全部大写):(1)用户自定义环境变量:名称-自定义,作用-自定义,内容-自定义;(2)系统自带环境变量:命令-确定,作用-确定,内容-可以修改(建议默认);
- 位置参数变量:名称-确定,作用-确定,内容-可以改;
- 预定义变量:名称-确定,作用-确定,内容-可以改;
变量的增删改查:
变量的增加和修改直接在变量上进行赋值即可。主要是将一下变量的删除和查找。
变量查找set:
set [选项]
-u:若设定此选项,则调用未声明变量时会报错;
-x:在命令执行前,会把命令再输出一次(用的少);
变量删除unset:
unset [变量名]
对于系统环境变量的设置、查找和删除:
环境变量的定义使用export命令:
export [变量名]=[内容]
set与env都可以使用,查看到的环境变量可能会有部分重叠。环境变量的删除也用unset。
(1)PATH环境变量:系统查找命令的路径
[root@jone ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
一般的系统命令不需要加绝对路径就可以执行,主要是因为在linux执行命令时会去PATH的路径中查找是否存在该命令,若存在就可以执行,若不存在就无法执行。
对于个人写的脚本文件,要想直接就可以执行,不添加路径,有两种方法。(1)第一种是将脚本文件cp到/bin目录中;(2)第二种方法是在PATH路径中添加本脚本文件的路径(PATH=$PATH:[脚本路径])
(2)PS1变量(环境变量)
可以按照我们自己的需求来定义提示符。
PS1环境变量得默认值为:
[root@jone ~]# echo $PS1
[\u@\h \W]\$
[root@jone ~]# set | grep PS1
PS1='[\u@\h \W]\$ '
(3)LANG(环境变量):
linux中文支持:
- 安装了中文字体和编码;
- 操作终端必须支持中文编码;
定义了linux的主语系体系。
locale -a | more命令可以查看系统可以支持哪些语系;
查看当前系统的语系:
[root@jone ~]# locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
[root@jone ~]#
要想修改LANG系统重启后也生效,则需要修改/etc/sysconfig/i18n文件内容。如果需要在纯字符界面显示中文,需要安装中文插件即可。
位置参数变量
往脚本中传递参数。
第一个和第四个好理解,一个代表第几个参数,另一个代表传了多少个参数。第二个和第三个,可以通过测试可知,第二个是把输入的参数全部当作一个整体,第三个是把每个参数区分对待。
接收键盘输入
预定义变量
第一个好理解,上一条命令执行成功返回0,失败则非0。第二和第三个的意义如下所述,用的少。
shell的运算符
数值运算
declare声明变量类型
- 一般对于数值运算时,declare -i cc=$a+$b等价于cc=$(($a+$b)),一般后者较为常用一些,也可以用expr/let,但使用比较少吧;
- declare -x可以声明环境变量,效果等价于export;
数组:
对于shell语言而言,数组变量使用的也相对较少,输出数组所有值命令:echo ${[数组名][*]}
shell常用运算符
没什么好说的。
变量的测试与内容置换
通过检测x的值来判断y值
环境变量配置文件
source 配置文件/. 配置文件
说明:表示重新加载对应配置文件的环境变量;
- /etc/profile:定义umask、history环境变量,所有用户生效;
- /etc/profile.d/*.sh:定义LANG,所有用户生效;
- ./bash_profile:定义PATH环境变量,不同用户各自生效;
- ./bashrc:定义alias环境变量,不同用户各自生效;
- /etc/bashrc:定义PS1环境变量、没有登录的UMAST权限、没有登陆的PATH变量,所有用户生效;
正常加载从/etc/profile到etc/bashrc;当我们有时误删了环境变量的配置文件时,提示符会变,这时可以从其他操作系统cp一个过来就行。
注销时生效的环境变量配置文件:.bash_logout,对于我们在退出登录时候所做的操作,比如清楚历史命令等;
其他环境变量配置文件:.bash_history等;
shell登录信息提示
登录前的提示信息:(1)/etc/issue;(2)/etc/issue.net;
登录后的提示信息:/etc/motd;
- 第一个代表本地登录的终端提示信息;
- 第二个代表远程的终端提示信息。除了修改/etc/issue.net提示信息,还需要修改ssh的配置文件信息,提示内容issue.net不支持转义符,也就不能显示本地终端上的\d、\m等对应内容,如下所示:
stty定义/查找/修改快捷键: