Shell的作用
命令解释器,“翻译官”
shell作为一个人机接口,用于解释用户输入的命令,将命令解释为Linux内核可以执行的二进制代码,并将执行的结果返回在标准终端上。
- shell在Linux系统中的位置
- shell的分类
Bourne Shell:从1979年起Unix就开始使用,Bourne Shell的主文件名为sh。
C Shell:C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名。
Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。
Bash: Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell。 其属于Bourne家族。
补全命令 输入一部分命令或文件,按“Tab”,经常使用。
命令别名
alias 别名=‘原命令’ (等号两边不能有空格)
alias的作用仅在该次登入的操作,即输入一次alias后,这个修改只在当前的Shell生效。如果重新开启一个 Shell,或者重新登录,则这些alias将无法使用。好在linux中提供alias永久化的方法:
<1>.若要每次登入就自动生效别名,则把别名加在/etc/profile或~/.bashrc中。然后# source ~/.bashrc
<2>.若要让每一位用户都生效别名,则把别名加在/etc/bashrc最后面,然后# source /etc/bashrc
删除别名
unalias 别名
多命令执行
: 命令1:命令2 顺序执行多个命令,无逻辑关系
&& 命令1&&命令2 逻辑与,1正确执行,2才会执行;1不正确,2不会执行
|| 命令1||命令2 逻辑或,1正确,2不会执行;1不正确,2执行
-
管道符
命令1 | 命令2 -
tee 将传输过程中的输出保存
命令1 | tee 保存文件|命令2
-a:以累加方式,将数据加入file中 -
echo 输出命令
\a 发出警告声
\b 删除前一个字符
\c 最后不加上换行符号
\f 换行但光标仍旧停留在原来的位置
\n 换行且光标移至行首
\r 光标移至行首,但不换行
\t 插入tab
\v 与\f相同
\ 插入\字符
\nnn 插入nnn(八进制)所代表的ASCII字符
为什么要使用Shell脚本
使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象。缺点是:它们的效率通常不如编译型语言。不过权衡之下,通常使用脚本编程还是值得的:花一个小时写成的简单脚本,同样的功能用C或C++来编写实现,可能需要两天,而且一般来说,脚本执行的速度已经够快了,快到足以让人忽略它性能上的问题。
Shell脚本的基本元素
(1) #!/bin/bash 必须的,指出shell的类型
(2)# 注释
(3)变量
(4)控制
一个shell脚本
vi datewho.sh
#!/bin/bash
'# this is first shell (去掉单引号,下面同理)
date; who
常见运行Shell脚本方法
方法1:
方法2:
'# sh ./datewho.sh
2016年 12月 16日 星期五 11:05:55 CST
root tty1 2016-12-16 11:03 (:0)
root pts/0 2016-12-16 11:05 (:0.0)
'# chmod +x datewho.sh
'# ./datewho.sh
2016年 12月 16日 星期五 11:15:55 CST
root tty1 2016-12-16 11:03 (:0)
root pts/0 2016-12-16 11:05 (:0.0)
变量
shell 变量 可以保存如路径名、文件名或者一个数字
变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name” 则是错误的 。
在Bash 中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型 。
变量分类
本地变量(用户变量) 局部变量只在创建它们的Shell中使用,可以在shell程序内任意使用和修改它们。
环境变量 可以在创建它们的Shell及其派生出来的任意子程序中使用。有些变量是用户创建的,其他的则是专用的(比如PATH、HOME)。是系统环境的一部分,不必去定义它们,可以在shell程序中使用它们 。还能在shell中加以修改。
内部变量 由系统提供的。与环境变量不同,但用户不能修改它们。
本地变量 在用户现在的shell生命期的脚本中使用**
变量名=值**
注意:
(1)等号两边不可以有空格
(2)取值包含空格,必须用双引号括起来
(3)Shell变量可以用大小写字母,区分大小写
本地变量
变量的声明和使用
(1)变量是弱类型的(不用声明类型)
(2)变量声明及赋值格式
变量=值(等号两边不能有空格)
(3)变量的引用
$变量名
${变量名}
变量名为1个字符时建议使用方式一,多余一个字符时建议使用方式二
显示变量
echo $Name
echo $name
echo $nameare
echo ${name} are
echo显示输出
功能:显示文字
语法:echo [-ne][字符串] / echo [–help][–version]
-n 不要在最后自动换行
-e 打开反斜杠ESC转义。若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:\t 插入tab;\ 插入\字符;
-help 显示帮助
-version 显示版本信息
清除变量
unset 变量名
环境变量
环境变量用于所有用户进程(通常称为子进程)。登陆进程称为父进程,通过pstree可以查看
环境变量可以用于所有子程序,着包括编辑器、脚本和应用
环境变量可以在命令行中设置,但用户注销时这些值将丢失
环境变量均为大写
必须用export命令导出
设置环境变量
variable-name=value
export variable-name(环境变量名大写)
显示环境变量
env 可以看到所有的环境变量
echo $环境变量名 (显示一个变量)
清除环境变量
unset 环境变量名
HOME : 代表使用者的家目录。cd ~ 去到使用者的家目录 或者利用 cd就可以直接回到使用者家目录了。
SHELL : 目前这个环境使用的 SHELL 是哪个程序? 如果是 bash 的话,预设是 /bin/bash。
PWD:用户当前工作目录的路径。它指出用户目前在Linux文件系统中处在什么位置。它是由Linux自动设置的。
HISTSIZE : 这个与“历史命令”有关,曾经下达过的指令可以被系统记录下来,而记录的“数目”则是由这个值来设定的。
ENV : 这个使用者所使用的个性化环境设置文件的读取文件。
MAIL : 当我们使用 mail 这个指令在收信时,系统会去读取的邮件信箱文(mailbox)。
PATH : 就是执行文件搜寻的路径,目录与目录中间以冒号(:)分隔, 由于文件的搜寻是依序由 PATH 的变量内的目录来查询,所以,目录的顺序也是重要的喔。
LANG : 语系文件,很多数据都会用到他,当出现编码错误的时候往往需要设置它,中文编码是zh_CN.UTF8。
让环境变量的修改在退出shell再次登录时仍有效,需要在相关配置文件中修改。
Bash的初始化文件有:
/etc/profile:存放一些全局(共有)变量,不管哪个用户,登录时都会读取该文件。通常设置一些Shell变量PATH,USER,HOSTNAME和HISTSIZE等。
~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
~/.bash_login、
~/.profile、
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。
上述配置文件的作用
1)登录Linux先启动系统配置文件/etc/profile,并从/etc/profile.d目录的配置文件中搜集shell的设置,为系统的每个用户设置环境信息。
2)用户配置文件~/.bash_profile,每个用户专用于自己使用的shell信息,仅用户登录时执行一次!默认情况下,此文件通过脚本执行同目录下用户的
.bashrc文件。
3)~/.bashrc文件包含专用于用户bash shell的bash信息,登录及每次打开新的shell时都会执行。里面又会调用/etc/bashrc
设置用户自己的环境变量
在/home/user/.bash_profile中定义下句,会怎样?
alias la=‘ls –a|grep “.*”’
答:user下次再登陆,其shell会自动建立一个别名命令la,功能为查看当前目录下名字以.开头的文件。
写在~/.bash_profile中,需重新登录才能有效。除非运行source.bash_profile使其立即有效。
写在~/.bashrc中,则打开新的终端中就有效
区别:bash_profile只在会话开始的时候读取一次,而bashrc则每次打开终端时都会读取
按照传统,定义的变量如PATH放到.bash_profile中,而像别名函数等放在.bashrc中,但是.bash_profile先于.bashrc读取内容,也可全放入.bashrc中
要习惯用各自的配置文件,编辑不需要root 权限
内部变量
内部变量是Linux所提供的一种特殊类型的变量,这类变量在程序中用来作出判断。在shell程序内这类变量的值是不能修改的。
部分内部变量是:
$# ——传送给shell程序的位置参数的数量
$?——最后命令的完成码或者在shell程序内部执行的shell程序(返回值)。0表示没有错误,其他任何值表明有错误。
$0——shell程序的名称
$@——调用shell程序时所传送的全部参数的单字符串,“参数1”“参数2”…形式保存的参数
$* “参数1 参数2”…形式保存的参数
$n 第n个参数
$$ 本程序的PID
Shell中的特殊符号
1、注释符#
除了#!/bin/bash里的#特殊
2、美元符 $
变量符。与反斜杠转义符相反,使其后的普通字符作为变量名,如
a
表
示
变
量
a
的
值
。
变
量
字
符
长
度
超
过
1
个
时
,
用
括
起
来
3
、
单
引
号
被
引
起
的
字
符
全
部
做
普
通
字
符
,
即
全
部
原
样
4
、
双
引
号
引
号
内
的
内
容
,
除
a表示变量a的值。变量字符长度超过1个时,用{}括起来 3、单引号 被引起的字符全部做普通字符,即全部原样 4、双引号 引号内的内容,除
a表示变量a的值。变量字符长度超过1个时,用括起来3、单引号被引起的字符全部做普通字符,即全部原样4、双引号引号内的内容,除、转义符\、倒引号`这三个保留特殊功能,其他字符均做普通字符。
5、倒引号(数字1键旁边的那个键)
引号内的字符串当做shell命令行解释执行,得到的结果取代整个倒引号括起来的部分。
6. 反斜线
反斜线是转义字符,它能把特殊字符变成普通字符。在某个字符前面利用反斜杠(\)能够阻止shell把后面的字符解释为特殊字符。
7.获取字符串长度
string=“abcd”
echo ${#string} #输出 4
8.提取子字符串
以下实例从字符串第 2 个字符开始截取 4 个字符
string=“runoob is a great site”
echo ${string:1:4} # 输出 unoo