目录
为什么系统上合法的Shel1要写入/etc/she1ls这个文件
用户什么时候可以取得shell来工作?用户默认会取得哪一个shell?
一、Shell简本概述
Shell的作用
Shell基本概念
面向字符串的编程语言
-
将要执行的命令按顺序保存到一个文本文件;
-
给该文件可执行权限;
-
可结合各种Shell控制语句以完成更复杂的操作
Shell脚本应用场景
-
重复性操作
-
交互性任务
-
批量事务处理
-
服务运行状态监控
-
定时任务执行
Shell作用——翻译官
shell是一个特殊的应用程序,它介于操作系统内核和用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
为什么系统上合法的Shel1要写入/etc/she1ls这个文件
因为系统某些服务运行过程中,会去检查用户能够使用的Shell,而这些shell的查询就是借由/etc/shells这个文件。
用户什么时候可以取得shell来工作?用户默认会取得哪一个shell?
当用户登录的时候,系统就会给我一个shell让我来用,而这个登录取得的Shell就记录在/etc/passwd这个文件内
Shell编程规范
编写脚本规范
脚本申明(解释器) :
若第一行为“!/bin/bash",表示此行以下的代码语句是通过/bin/bash程序来解释执行,#!/bin/bash为默认解释器。
还有其它类型的解释器,比如# !/usr/bin/python. #! /usr/bin/expect.
注释信息:以“#"开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行。
可执行语句:比如echo命令,用于输出”"之间的字符串
如果想要把文本字符串和命令输出显示在同一行中,可以使用echo语句的 -n 参数
Shell脚本执行方法
法一:指定路径的命令,要求文件必须有x权限
chmod +x zz.sh
zz.sh
如果不再当前目录
chmod +x /root/zz.sh
cd /root/
./zz.sh
法二:指定Shell来解释脚本,不要求文件必须有x权限
bash zz.sh
ps aux | wc -l会多统计一行属性
法三:source 脚本路径执行shell脚本,source会使用当前shell环境运行代码
. 也代表source作用
source demo.sh == . source
命名要求
区分大小写
不能使程序中的保留字和内置变量:如: if, for, hostname
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线“-",和主机名相反
不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
驼峰StudentFirstName
小驼峰studentFirstName·
下划线: student_name
脚本错误
命令错误:命令出错不会影响接下来的命令继续2.语法错误
语法错误:会影响接下来的命令继续
逻辑错误:只能自己去筛查
查找代码的正确:
bash -n 脚本名称 (不在当前目录下加绝对路径) 检查语法错误
bash -x 脚本名称 (不在当前目录下加绝对路径) 检查逻辑错误
管道与重定向
由于Shell脚本“批量处理”的特殊性,其大部分操作过程位于后台,不需要用户进行干预,因此要学会提取、过滤执行信息变得十分重要,所以我们需要重定向和管道。
管道
将管道符号“|"左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道.
[root@localhost ~]#ps aux |wc -l #查看进程数
267
[root@localhost ~]# echo "123123" | passwd --stdin mxh #给mxh设置密码
重定向
交互式硬件设备
重定向操作
实例:
重定向输入
把123123重定向输出到pass.txt中,然后将pass.txt内容重定向输入给lisi的密码
注意SELinux 会影响此命令执行,若执行失败可尝试关闭SELinux(setenforce 0)。
[root@localhost ~]# setenforce 0
[root@localhost ~]# useradd lisi
[root@localhost ~]# echo "123123" > pass.txt
[root@localhost ~]# passwd --stdin lisi < pass.txt
重定向输出
把111输入11.txtx中,在输入222会覆盖,使用>>则在后面追加
[root@localhost ~]# echo "11111" > 11.txt
[root@localhost ~]# cat 11.txt
11111
[root@localhost ~]# echo "222222" > 11.txt
[root@localhost ~]# cat 11.txt
222222
[root@localhost ~]# echo "33333" >> 11.txt
[root@localhost ~]# cat 11.txt
222222
33333
ls -lh > log.txt 2>&1 等同于 ls -lh &> log.txt > (将标准输出结果保存到指定的文件)
2>&1(将标准错误输出重定向到标准输出)
&>(将标准输出、标准错误输出保存到同一文件)
清空内容,执行命令,两条命令结果相同
XXX | ls
XXX | re
Shell脚本变量
Shell变量的作用
-
用来存放系统和用户需要使用的特定参数(值)
-
变量名:使用固定的名称,由系统预设或用户定义
-
变量值:能够根据用户设置、系统环境的变化而变化
变量作用范围
-
局部变量:默认情况下,新定义的变量只在当前的Shell环境中有效,当进入子程序或新的子Shell环境时局部变量将无法再使用。
-
全局变量:通过内部命令export将指定的变量导出为全局变量,使用户定义的变量在所有的子Shell环境中能够继续使用。
变量名设置格式:变量名=变量值
全局变量格式:export 变量名=变量值
实例:
不设置全局变量,声明变量,切换系统后消失
用export声名的,切换系统后仍然生效
永久变量 需要在/etc/profile文件里面添加 切换系统一样生效
vim /etc/profile
export PATH+=:/mnt
[root@localhost data]#source /etc/profile //执行
[root@localhost data]#echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/data:/mnt
整数变量的算术计算
运算符:+
加法
、-减法
、*乘法
、/除法
、%取余
常见表达式
expr不可计算小数,并且变量和运算符之间需要空格分隔
[root@localhost data]#expr 1 + 2
3
计算乘法时,需要使用“\”转义符
[root@localhost data]#expr 1 \* 2
2
let的使用
[root@localhost ~]# q=5
[root@localhost ~]# w=4
[root@localhost ~]# z=0;let z=q*w;echo $z
20
bc可以进行小数点计算(这里结合了管道符一起使用)
[root@localhost ~]# echo 1.1 + 2.2|bc
3.3
Shell变量的类型
-
自定义变量:由用户自己定义、修改和使用;
-
特殊变量:环境变量,只读变量,位置变量,预定义变量。
自定义变量
unset 变量名 //删除变量
定义新的变量
格式:变量名=变量值
[root@localhost ~]#abc=123
查看定义的变量的值
格式echo $变量名
[root@localhost ~]#echo $abc
123
赋值时使用引号
双引号:允许通过$符号引用其他变量值
单引号:禁止引用其他变量值, $视为普通字符
反撇号:命令替换,提取命令执行后的输出结果,``和$(…)作用相同
从键盘输入内容为变量赋值
法一:read命令获取输入内容
read -p 提示信息 变量名
echo $变量名
[root@localhost demo]# read -p "mxxxxxh " NAME
mxxxxxh xcccc
[root@localhost demo]# echo $NAME
xcccc
法二:在脚本中编写,在命令行实现read获取
[root@localhost ~]#vim ming.sh
#!/bin/bash
read -p "me:" name
echo "---------"
read -p "she:" name1
echo "---------"
echo "me:"
echo $name
echo "she:"
echo "$name1"
环境变量
使用 env 命令可以查看到当前工作环境下的环境变量
变量USER表示用户名称
HOME表示用户的宿主目录
LANG表示语言和字符集
PWD表示当前所在的工作目录
变量PATH表示可执行程序的默认搜索路径
配置文件:/etc/profile(全局生效)、~/.bash_profile(当前用户环境)
只读变量
变量值不允许被修改
格式:readonly 【选项】【参数】
[root@localhost data]#readonly a=1
[root@localhost data]#a=2
只读变量 无法修改 也不能删除
位置变量
当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
$n:n为数字,$0代表命令本身,1~9代表第一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为 ${10}
预定义变量
$* 和 $@:都会表示命令或脚本要处理的参数。
-
$* :把所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 $3 $4 "
-
$@:把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回,代表“$1” “$2” “$3” “$4”
扩展:如何把两个文件合并成一个
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。