目录
一、Shell概述
1.1 概述
在Linux中shell是一个特殊的应用程序,相当于windows中的dos,Shell 脚本(shell script),是一种为 shell 编写的脚本程序。业界所说的 shell 通常都是指 shell 脚本。
1.2 查看本机的shell信息
[root@localhost data]# cat /etc/shells ##查看当前系统支持的shell
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
[root@localhost data]#
bash | 基于gun的框架下发展的shell |
csh | 类似c语言的shell |
tcsh | 整合了csh提供了更多功能 |
sh | 已经被bash替换 |
nologin | 这个shell可以让用户无法登录 |
1.3 Shell脚本规范
脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python #!/bin/expect
注释信息:以#开头的语句表示为注释信息
可执行语句:比如echo命令用于输出“ ”之间的字符串
[root@localhost data]# vim first.sh ##以.sh结尾
#!/bin/bash
echo "hello shell!" ##输出一段文字
1.4 脚本错误纠察
-
语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
-
命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
-
逻辑错误:只能使用 bash -x 进行
bash -n +脚本名 (若不在当前目录下加绝对路径) 检查语法是否错误
bash -x +脚本名 (若不在当前目录下加绝对路径)检查逻辑是否错误
二、shell中重定向与管道符
2.1 重定向
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件读取数据,而不是键盘输入 |
重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
2>> | ||
混合输出 | &>将错误信息追加到指定的文件中 | 将标准输出、标准错误的内容保存到同一个文件中 |
案例一:
[root@localhost data]# ls >/dev/pts/1 ##查看/dev下的所有,并显示在另一个终端上
[root@localhost ~]# 99.bak first.sh name.bak while1.bak while2.bak while3.bak while.bak
[root@localhost pts]# xxx >/dev/pts/1 ##当错误的重定向则会不显示
bash: xxx: 未找到命令...
案例二:
[root@localhost pts]# xxx 2>/dev/pts/1 ##如果是2>,即使是错误的也会显示
[root@localhost ~]# bash: xxx: 未找到命令...
案例三:
[root@localhost data]# touch passwd.txt ##创建一个文本文件
[root@localhost data]# echo "123" >> passwd.txt ##将内容追加进文本文件
[root@localhost data]# cat passwd.txt
123
[root@localhost data]#
2.2 管道符
管道符 :|
将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用
[root@localhost data]# echo "123123" |passwd --stdin liu
更改用户 liu 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost data]#
三、变量与赋值
3.1 变量
常见的变量包括:
自定义变量:由用户自己定义,修改和使用
环境变量:由系统维护,用于设置工作环境
只读变量:只可以读取不可以更改
位置变量:通过命令行给脚本传递参数
预定义变量:Bash中内置的一类变量,不能修改
系统类置变量:PATH,UID,HOSTNAME.
$*:表示所有位置参数的内容看成一个整体返回
$@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回
$?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0 值均表示执行出现异常
$#:表示命令行中位置参数的个数
$0:表示当前执行的脚本或程序的名称
3.2 赋值
1. 赋值时使用双引号("")可以直接调用变量
2. 赋值时使用单引号('')$只会被认为是字符$ 不会调用变量
3. 赋值时使用(``反撇在tab上面)命令替换,提取命令执行后的输出结 果$() 用法相同
4. {}可以分隔变量值