1、shell概述
Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
2、shell脚本的构成
1. 脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python #!/bin/expect
2. 注释信息:以#开头的语句表示为注释信息
3. 可执行语句:比如echo命令用于输出“ ”之间的字符串
3、如何调用写好的脚本?
source 和 . 会在当前 shell 环境中执行脚本 bash sh 绝对路径 相对路径 执行的脚本 会创建一个子shell环境,并在这个子shell环境中执行这个脚本
4、重定向 详解
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
交互式硬件设备
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
重定向的意思就是 ,不通过标准输出到屏幕上,输出到你指定的位置
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
2>> | 标准错误输出结果追加到指定的文件尾部 | |
混合输出 | &>无论对错都可以重定向 | 将标准输出、标准错误的内容保存到同一个文件中 |
ls -lh &> log.txt
ls -lh > log.txt 2>&1
ls -lh 标准输出 1 -- > 屏幕
> log.txt 1 --> log.txt
2>&1 2 --> 1 , 1 指向 log.txt ,所以 2 也就指向了 log.txt
`...` 等同于 $(...)
[root@test1 ~]# vim passwd.txt\\重定向输入
123321
[root@test1 ~]# setenforce 0 \\关闭selinux否则会有问题
[root@test1 ~]# passwd --stdin lisi < passwd.txt
#输入重定向
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@test1 ~]# cat passwd.txt
123321
[root@test1 ~]# echo "123123" > passwd.txt //单个覆盖,多个不覆盖追加
[root@test1 ~]# cat passwd.txt
123123
## 多行重定向
[root@localhost ~]#cat > ky15.txt
#需要回车才会写入
hhh
111
ky15
[root@localhost ~]#cat >file.txt <<EOF
111
222
333
444
EOF
[root@localhost ~]#cat file.txt
111
222
333
444
5、变量的详解
5.1、常见shell变量的类型包括:
自定义变量:由用户自己定义,修改和使用*
环境变量:由系统维护,用于设置工作环境 可以用env命令查看*
只读变量:只可以读取不可以更改*
位置变量:通过命令行给脚本传递参数*
预定义变量:Bash中内置的一类变量,不能修改 有些规定好的变量 放在那里让你使用*
5.1.1、位置变量
位置变量也称为位置参数,使用" $1、$2、$3、…$9" 表示
./first.sh one two three four five ...... 10 .... 20
$0 $1 $2 $3 $4 $5 ${10} ${20}
5.1.2 预定义变量
是由Bash程序预先定义好的一类特殊变量,可以直接去使用,但是不能创建新的预定义变量,也不可以直接为预定义变量赋值
$0 代表脚本本身
$# 代表脚本后面跟的参数(位置变量)的个数
$* 不加双引号的话 $* 和 $@都代表脚本后面跟的所有参数,加上双引号 "$*" 会把所有参数当做一个整体的参数(此时参数数量为1)去看待
$@ 加上双引号 "$@" 会把脚本后面跟的每一个参数当做一个个体去看待
$? 代表上一条命令或者脚本执行后返回的状态码,返回值为0表示执行正确,为非0值表示执行异常
5.2变量的命名要求
- 区分大小写
- 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
- 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH - 大驼峰 StudentFirstName
- 小驼峰 studentFirstName
- 下划线 student_name
5.3定义变量的方法
方法1: 变量名=变量值
方法2:
read 变量名 从键盘输入中获取变量名的值
read -p "提示 信息 " 变量名
echo -n "提示 信息 "
read 变量名
5.4变量的作用范围
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。
可以通过内部命令 export 将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用
/etc/profile /etc/bashrc /root/.bash_profile /root/.bashrc
1. 系统每次启动都会自动执行 /etc/profile 文件里的命令,这个文件是对全局有效的(所有的shell环境和用户)
2. 不同用户登录系统 会自动执行 自己家目录中的 ~/.bash_profile 文件中的命令,自动执行 ~/.bashrc
3. ~/.bashrc 当前用户每切换一个shell环境都会自动执行,执行 /etc/bashrc
4. /etc/bashrc 针对所有用户的,用户每切换一个shell环境都会自动执行
5.5变量赋值时特殊符号
1. 赋值时使用双引号(" ")可以直接调用变量
2. 赋值时使用单引号(' ')$只会被认为是字符$ 不会调用变量
3. 赋值时使用(``反撇在tab上面)命令替换,提取命令执行后的输出结果 。与 $( ) 的 用法相同
4. {}可以分隔变量值
5.6 shell的整数运算
shell默认只支持整数的运算
运算符:
加法 +
减法 -
乘法 *
除法 /
取余 (取模)%
常用的运算表达式如下 :
i=$(expr 12 * 5)
i=$((12*5))
i=$[12*5]
let i=12*5
let i++ i=$[$i+1]
let i-- i=$[$i-1]
let i+=2 i=$[$i+2]
let i/=2 i=$[$i/2]
6、管道符: |
管道符 |
将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用
[root@localhost opt]# ls /opt |wc
2 2 12
修改密码
[root@localhost opt]# echo "123123" |passwd --stdin zhangsan
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新
[root@test1 ~]# grep "/bin/bash$" /etc/passwd
root:x:0:0:root:/root:/bin/bash
zhangsan:x:1000:1000:zhangsan:/home/zhangsan:/bin/bash
lisi:x:1001:1001::/home/lisi:/bin/bash
[root@test1 ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'
root /bin/bash
zhangsan /bin/bash
lisi /bin/bash