1、理解Shell功能作用
2、编写第一个shell脚本:输出hello world
3、变量
4、流程控制(分支、循环)
5、shell其他注意事项
6、正则表达式
Unix最常见的shell:bash shell
Windows的shell:cmd powershell
shell脚本的作用:把命令写在可执行文件中,执行文件相当于执行命令,并且可以在其中添加分支、循环等高级功能
shell脚本必须为可执行文件,如果在PATH路径中,可以直接使用文件名进行调用。
which <命令> #查看命令的文件路径
在屏幕上输出hello world
echo “hello world”【用引号引起来,是一个整体】
写入一个可执行文件(通常文件以sh结尾【xxx.sh】)
新建一个1.sh,写入以下内容
#!/bin/bash #用bash shell语法运行
echo 'hello world'
#!符号能够被内核识别为一个脚本的开始,这一行必须位于脚本的首行,/bin/bash 是bash程序的绝对路径,在这里表示后续的内容将通过bash程序解释执行。
执行shell脚本(先加权限)
chomd +x 1.sh
sh 1.sh #不需要执行权限
或 bash 1.sh #不需要执行权限
或 ./1.sh
或 <绝对路径/相对路径> 1.sh #需要执行权限
或 source 1.sh
或 . 1.sh
使用 env 命令可以查看环境变量,使用 set 命令可以查看局部变量。
变量不需要提前声明
$变量名 ——取变量的值
定义系统的相关配置项,例如默认的文本编辑器
系统的相关配置项 export查看
echo $hostname
echo $shell
export
$1 #第一个变量
$2 #第二个变量
ls -a -l #-a是第一个,-l是第二个
$? #上一个命令的返回值(【一般】正确0错误非0)
$n #n为数字,10以上要加{}(${10}),第n个命令
$* #命令行中所有参数
$@ #所有参数,但把每个参数区分对待
$# 命令行中所有参数的个数
pie=3.14 命名空间(作用范围)是进程内部(当前窗口、用户的shell)
echo $pie
“双引号”:引号内的变量会生效
‘单引号’:引号内的变量不会生效
`后/反引号` :引号内的命令会生效【等价于$()】
\:转义符,后面第一个字符没有任何特殊含义
echo "$hostname"
echo '$hostname'
echo `pwd`
echo "\$hostname"
命令本身也是文件
which <命令> 查看命令的文件路径
a) 定义 shell 变量(局部变量)
A=a #定义变量 A 的值为 a
B=b #定义变量 B 的值为 b
A_B=123 #定义变量 A_B 的值为 123
echo $A #使用美元符号“$”表示变量
echo $A_B #正确用法:echo ${A_B} 使用大括号括起变量,$()表示新执行括号中的命令,不能用于表示变量的范围
unset A #注销变量A
readonly A=a #声明静态变量A,不能注销(unset)
定义规则
变量名称可以由字母、数字和下划线组成,但不能数字开头
等号两侧不能由空格
变量名称一般习惯为大写
b) 设置环境变量
通过前面的例子介绍A=a 只是定义了一个局部变量,只会在本 shell 中生效,如果要在其他 shell 中生效的话,例如子 shell,就需要导出为环境变量。(环境变量在其他的窗 口下也无法生效)使用 export 命令实现导出。
为了让/etc/profile的环境变量生效,需要使用source /etc/profile重启系统或者注销用户
使用自定义的环境变量:
A_HOME=/地址
echo "a_home=$A_HOME"
c) 自动设置变量
当 Bash 启动的时候,会加载变量的配置文件来初始化 shell 环境。因此,通过配置变量的配置文件,可以设置变量重启后依然生效,设置在所有的会话和 shell 中都生效。
/etc/profile(系统全局变量和登录系统的一些配置)
~/.bash_profile(用户自定义配置)
~/.bashrc(影响所有的交互式 shell 用户的配置)
/etc/bashrc(全局自定义配置) Bash 按以上顺序运行配置文件,后运行覆盖前运行文件的同名变量。
d) 取消设置变量
export -n <变量> #将变量从环境变量变回局部变量
unset <变量> #取消变量设置
注意:
if语句
if [ 条件1 ];then
xxxxx
elif [ 条件2 ];then
xxxx
......
else
xxxxx
fi
写一个脚本,判断用户的输入是yes or no
if[ 输入 = yes ];then
echo "your input is right"
elif[ 输入 = no ];then
echo "no"
else
echo "error"
fi
case语句
case 变量的值 in
值1)
xxxx
;;
值2)
xxxx
;;
*)
xxxx
;;
esac
输入的处理:Linux自带了一个函数read,默认从键盘读取输入,如果不指定变量,默认赋值给一个变量REPLY
for循环
for 变量 in 变量的值
do
xxxx
done
【自动统计当前目录下文件数量】
思路:1、找出所有文件;2、设置一个计数器,找到一个文件就加一;3、最后一个文件,后面没有就结束,返回计数器的值
【统计其他文件夹下的文件数】
方法1:去到对应目录,执行该脚本,不需要将脚本复制过去(脚本在哪不重要,重要的是在哪里执行)
方法2:将路径指定为预定义变量(加个$1)
for (( i=0; i<10; i++))
do
xxxx
done
i=0 循环开始时,变量的值是0
i++ 每循环一次,i在原来基础上+1
i<10 直到不满足i<10条件终止循环
while结构
while [ 条件 ]
do
xxxx
done
【写一个脚本计算1+2+…+100】
计数器sum,初始值0
变量i,初始值1,每次循环后自动+1
每次循环,都把i的值加到sum上
脚本在处理过程中,可以通过exit命令来退出。
同时,会结合0-255的整数参数来表示退出代码。
0表示执行正常,非零值表示执行错误 ,$?查看(只保留一个退出代码的值)
拿到脚本后先看环境(脚本在不同环境不能混用)
Linux中,文件名区分大小写
常见错误
漏空格/多空格(=前后无空格)
语句结构(if,else,then,fi/case,in,;;,esac/while,do,done/for,do,done)
有无引号、括号()、大括号{}
对变量的取值符号$
对齐(tab缩进)
公式匹配有一定规律的字符串
一种模式匹配语言,可使应用筛选数据以查找特定的内容
**管道符 | **
用法: 命令1 | 命令2
效果:命令1的输出作为命令2的输入
筛选grep
效果:根据指定的关键字(或表达式)筛选符合条件的内容(以行为单位)
全面搜索正则表达式并把行打印出来
grep [选项] <内容> <文件>
-v:表示反选,即筛选不带有匹配项的内容
-i:表示不区分大小写,默认区分大小写
-A/B <数字>:显示匹配项之后/之前的多少行
-e:提供逻辑项
【例1】匹配以小写字母作为行首的内容
"^[a-z]"
[]:可接受字符通配符,也就是[]中的任意内容,因此大写字母也可以写成[A-Z],数 字可以写成[0-9]
^:表示行首,如果要表示行尾,则使用$ 因此,需要表示空行就是“^$”,行首和行尾中间没有内容。
【例2】匹配行首为s,6位字母的内容
"^s[a-z][a-z][a-z][a-z][a-z]"
或
"^s[a-z]{5}" #使用{N}表示执行多次
{N}表示执行多次是grep命令的扩展用法,因此,需要写成egrep;另外如果有以s为 行首,7位字母的内容也会匹配,因为它也能够符合以上命令。
【例3】匹配以host开头,后面可能是2-4个数字的不确定情况
"^host([0-9]{2,4})?"
()?:表示括号中的内容可能存在也可能不存在
{2,4}: 表示重复2-4次
【例4】匹配以h**t的内容,缺失了中间两个字符
"h..t" #使用(.)表示匹配任意字符
如果中间缺失的字符数量也不清楚,可以使用无限制通配符(),表示在()前面的一 个字符可以为任意数量。示例:h.*t表示h和t中间可以有任意数量的任意字符
【例5】匹配[0-9]的文本内容
"\[0\-9\]" #使用转义符(\)实现特殊字符的转义
也可以写成 \[0-9]
,就可以实现转义
【例6】匹配[0-9]或{5}的文本内容
"\\[0-9]|\\{5}" #使用竖线(|)表示“或”逻辑,等价于grep的-e选项
【例7】匹配带有一个b或者多个b的内容
"b+" #使用加号(+)表示一个或多个
【例8】匹配文件中的电话号码
方法一:
"[0-9]{11}"
方法二:
"^1[0-9]{10}$"
[0-9] 数字
[a-z] 小写字母
[A-Z] 大写字母
[xyz]:字符集合,匹配所包含的任意一个字符
. :匹配任意单个字符
?:前面的字符出现0次或1次
+:前面的字符出现1次或多次(ab+ abb abbbb abbbbbbb)
*:前面的字符出现0次或多次
^:输入字符串的开始位置
$:输入字符串的结束位置
{3} 前面的字符出现3次
{3,5} 前面的字符出现3—5次
{3,} 前面的字符出现3次以上
{,5} 前面的字符出现5次以下
正则表达式中”|“代表”或“
根据文件创建用户、设置密码
跳过已有用户
准备文件:用户名、密码
循环,每次一行
把这一行拆分,分成用户名、密码
sed 对行做处理