文章目录
shell简介
- Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言;
- Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务;
- Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell;
Shell 既是一种脚本编程语言,也是一个连接内核和用户的软件。我们常常称之为shell解释器,翻译官等。Shell的种类有很多,它们各有所长,有的占用资源少,有的支持高级编程功能,有的兼容性好,有的重视用户体验。
1.Linux常用shell种类
不同的shell具备不同的功能,shell还决定了Linux中默认的shell是/bin/bash,流行的shell有ash、bash、ksh、csh、zsh等,不同的shell都有自己的特点以及用途。
-
ash
一个简单的轻量级的Shell,占用资源少,适合运行于低内存环境,但是与下面讲到的 bash shell 完全兼容。 -
bash
大多数Linux系统默认使用的shell,bash shell是Bourne shell 的一个免费版本,它是最早的Unix shell,bash还有一个特点,可以通过help命令来查看帮助。包含的功能几乎可以涵盖shell所具有的功能,所以一般的shell脚本都会指定它为执行路径。
bash兼容sh意味着,针对sh编写的Shell代码可以不加修改地在bash中运行。 -
csh
C shell使用的是“类C”语法,csh是具有C语言风格的一种shell,其内部命令有52个,较为庞大。目前使用的并不多,已经被/bin/tcsh所取代。 -
ksh
Korn shell的语法与Bourne shell相同,同时具备了C shell的易用特点。许多安装脚本都使用ksh,ksh 有42条内部命令,与bash相比有一定的限制性。 -
tcsh
tcsh是csh的增强版,与C shell完全兼容。 -
zsh
目前Linux里最庞大的一种shell,它有84个内部命令,使用起来也比较复杂。一般情况下,不会使用该shell。 -
sh
sh的全称是Bourne shell,由AT&T公司的Steve Bourne开发,为了纪念他,就用他的名字命名了。sh是UNIX上的标准shell,很多UNIX版本都配有sh。sh是第一个流行的Shell,现在已经被/bin/bash所取代。 -
nologin
指用户不能登录
扩展:查看shell
Shell是一个程序,一般都是放在/bin或者/user/bin目录下,当前Linux系统可用的Shell都记录在/etc/shells文件中。/etc/shells是一个纯文本文件,你可以在图形界面下打开它,也可以使用cat命令查看它。
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
2.shell脚本介绍
2.1 编辑shell脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell)
[root@localhost ~]# vim test.sh
#!/bin/bash //告诉系统这个脚本需要什么解释器来执行
echo "Hello World !" //echo 命令用于向窗口输出文本
2.2 运行 Shell 脚本的方法
1)作为可执行程序 ./脚本文件路径
将上面的代码保存为 test.sh,并 cd 到相应目录:
[root@localhost ~]# chmod +x ./test.sh #使脚本具有执行权限
[root@localhost ~]# ./test.sh #执行脚本
注意,一定要写成 ./test.sh,而不是 test.sh,运行其它二进制的程序也一样,直接写 test.sh,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 test.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。
2)sh 脚本文件路径
[root@localhost ~]# sh test.sh //不需要可执行权限也可执行脚本
3)source 脚本文件路径
[root@localhost ~]# source test.sh //也不需要可执行权限也可执行脚本
注意:source用法会自动切入脚本中的环境
3.重定向与管道操作
在实际的 linux 系统维护中,可以改变输入、输出内容的方向,而不使用默认的标准输入、输出设备(键盘和显示器),这种操作称为重定向。
3.1 交互式硬件设备
标准输入:从该设备接收用户输入的数据;
标准输出:通过该设备向用户输出数据;
标准错误:通过该设备报告执行出错信息。
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
3.2 重定向操作类型
重定向输入指的是将命令中接收输入的途径由默认的键盘改为指定的文件,而不是等待从键盘输入。重定向输入使用“<”操作符。
例:
[root@server1~]#vi pass.txt
[root@server1~]#useradd lisi
[root@server1~]#passwd --stdin lisi< pass.txt
更改用户 lisi的密码。
passwd:所有的身份验证令牌已经成功更新。
定向输出使用“>”或“>>”操作符号,分别用于覆盖或追加文件。
例:
[root@localhost ~]#uname -p > kernel.txt #显示CPU的类型覆盖到kernetl.txt
[root@localhost ~]#cat kernel.txt
x86_64 #这个结果是覆盖
[root@localhost~]# uname -r >> kernel.txt #显示内核版本信息追加到kernel.txt
[root@localhost ~]#cat kernel.txt
x86_64
3.10.0-514.el7.x86_64 #这个是结果是附加
- 补充 read 用法:
read <选项> <参数>
选项:
- -p:指定读取值时候的提示符;
- -t:指定读取值时候等待的时间;
- -a array:指定输出一个数组,赋值给array;
- -n 2:指定输入字符的任意类型的个数为2;
若不加参数,默认赋值给变量:REPLY
3.3 管道操作符号“|”
- 将左侧的命令输出结果,作为右侧命令的处理对象。
命令格式:
cmd1 | cmd2 [... | cmdn]
例:
[root@localhost ~]# grep "bash$" letc/passwd
root:x:0:0:root:/root:/bin/bash
teacher:x:500:500:BENET Linux Teacher:/home/teacher:/bin/bash
[root@localhost ~]# grep "bash$" /etc/passwd | awk -F. '{print $1,$7}'
root /bin/bash //awk用冒出分隔,输出第1、7个字段
teacher /bin/bash
4.shell变量
变量的作用:
用来存放系统和用户需要使用的特定参数(值)。
- 变量名:使用固定的名称,由系统预设或用户定义;
- 变量值:能够根据用户设置、系统环境的变化而变化变量的类型;
变量的类型:
自定义变量:由用户自己定义、修改和使用;
特殊变量:环境变量,只读变量,位置变量,预定义变量。
4.1 自定义变量
定义一个新的变量:
- 变量名以字母或下划线奸头,区分大小写,建议全大写。
变量名=变量值
查看变量的值:
echo $变量名
[root@localhost ~]# Pro=Python
[root@localhost ~]# Version=2.7.13
[root@localhost ~]# echo $Pro
Python
[root@localhost ~]# echo $Product $Version
Python 2.7.13
4.1.1 给变量赋值
赋值时使用引号:
- 双引号:允许通过$符号引用其他变量值;
- 单引号:禁止引用其他变量值,$视为普通字符;
- 反撇号:命令替换,提取命令执行后的输出结果。
从键盘输入内容为变量赋值:
read [-p"提示信息”] 变量名
4.1.2 设置变量的作用范围
格式1:export 变量名.…
格式2:export 变量名=变量值... //两种格式可以混合使用
[root@localhost ~]# echo "$Pro $Version"
Benet 6.0
[root@localhost ~]# export Pro Version //导出为全局变量
[root@localhost ~]# bash
[root@localhost ~]#echo "$Pro $Version" //子程序引用全局变量
Benet 6.0
[root@localhost ~]# exit
4.1.3 整数变量的运算
expr 变量1 运算符 变量2 [运算符 变量3]...
常用运算符:
- 加法运算:+
- 减法运算:-
- 乘法运算:*
- 除法运算:/
- 求模(取余)运算:%
扩展:
求两个数+、—、*、/、%的方法有三种:
例:
expr 1 + 2
echo $((1+2))
echo $[1+2]
注意:乘法在直接使用过程中是需要“ \ * “的,因为*是shell正则表达式中的特殊字符,所以需要转义字符\才能表示其真实含义,但是在 (()) 和 [] 中不需要转义字符。
expr 6 \*7
echo $ ((6*7))
echo $[6*7]
4.2 特殊的shell变量
4.2.1 环境变量
- 由系统提前创建,用来设置用户的工作环境;
- 配置文件: /etc/profile、~l.bash_profile常见的环境变量。
常见的环境变量:
- PWD、PATH
- USER、SHELL、HOME
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin:/root/bin
[root@localhost~]# PATH="$PATH:/root"
[root@localhost ~j# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin:/root/bin:/root
环境变量的详细介绍:
- 环境变量是和Shell紧密相关的,用户登录系统后就启动了一个Shell。对于Linux来说一般是bash,但也可以重新设定或切换到其它的Shell。对于UNIX,可能是CShelll。
- 环境变量是通过Shell命令来设置的,设置好的环境变量又可以被所有当前用户所运行的程序所使用。对于bash这个Shell程序来说,可以通过变量名来访问相应的环境变量,通过export来设置环境变量。
下面通过几个实例来说明:
- etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,并从/etc/profile.d自录的配置文件中搜集shell的设置。
注:在这里我们设定是为所有用户可使用的全局变量。 - /etc/bashrc:为每一个运行bash shell的用户执行此文件。当bash shell被打开时,该文件被读取。
- ~ /.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次默认情况下,他设置一些环境变量,执行用户的. bashrc文件。
注:在LINUX下面是代表HOME这个变量的。
另外在不同的LINUX操作系统下,这个文件可能是不同的,可能是~ /.bash_profile;~ /.bash_login或
~/.profile其中的一种或几种,如果存在几种的话,那么执行的顺序便是:
- ~/.bash_profile、 ~/.bash_Iogin、 ~/.profile。
4.2.2 只读变量
- 用于变量值不允许被修改的情况。
[root@localhost ~]# name=wind
[root@localhost ~]# readonly name //设置为只读变量
[root@localhost -]# echo $name
wind
[root@localhost~]# name=feng
-bash: name: readonly variable //只读变量不可以被重新赋值
[root@localhost -]# unset name //只读变量不可以被删除
-bash: unset: name: cannot unset: readonly variable
4.2.3 位置变量
- 为了在使用shell脚本程序时,方便通过命令行为程序提供操作参数,Bash引入了位置变量的概念。
- 当执行命令操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
位置变量也称为位置参数,使用$1、$2、$3、… 、$9、 $n 表示
注:$0属于预定义变量而不是位置变量。
示例:
[root@localhost ~]# ./myprog.sh one two three four five six
//$1,第一个位置参数为one
//$2,第二个位置参数为two
...
//$6,第六个位置参数为six
4.2.4 预定义变量
- $#:命令行中位置变量的个数;
- $*:所有位置变量的内容;
- $?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错;
- $0:当前执行的进程/程序名。
[root@localhost ~]# vim mybak.sh
#!/bin/bash
TARFILE=beifen-'date +%s`.tgz
tar zcf $TARFILE$*&>/dev/null
echo "已执行$0脚本,”
echo "共完成$#个对象的备份"
echo "具体内容包括:$*"
[root@localhost ~]# chmod +x mybak.sh
[root@localhost ~]# ./mybak.sh /etc/passwd /etc/shadow
已执行./mybak.sh 脚本,
共完成2个对象的备份
具体包括:/etc/passwd /etc/shadow