shell脚本笔记

一、 shell简介:
shell其实就是一种命令解析器。
查看系统默认的解析器是:
echo $SHELL
脚本的第一行:
#/bin/bash 指定bash解析器,如果不写就使用默认的解析器
注释:
用# 没有多行注释
运行脚本方法:
./ 脚本名字
. 脚本名字
Source 脚本名字
/bin/bash 脚本名字
数据类型:
字符串
变量的定义:
环境变量、本地变量
VAL=10
注意:变量名最好用大写
变量名和值之间没有空格
删除变量:
unset 变量名
将本地变量变为环境变量用:
export 变量名
控制语句:
if
else
switch
for
while
函数:

按要求查找:
查找文件名有四个字符的:
ls ???.sh
命令代换:
VAR=$(date)或者是VAR=date(反引号)
echo $VAR
注:
$ 变量名 取变量的值
$() 是将括号中的命令取值
和 {}和 ()的效果一样
$((变量名)) 对变量运算
KaTeX parse error: Expected 'EOF', got '#' at position 23: … 对变量运算 echo [2#̲10+3] 输出2进制的1…VAL”
列:
VAL=date
echo “VAL” 输出的是VAL
echo “ V A L ” 输 出 的 是 日 期 , 相 当 于 d a t e e c h o ‘ {VAL}” 输出的是日期,相当于date echo ‘ VALdateecho{VAL}’ 输出的是${VAL}
条件测试:
判别表达式:test 或 [] 测试结果 真为0 假为1
test 测试:
val=1
test $val -gt 1 比较val的值是否小于1
echo ? 输 出 上 一 次 程 序 运 行 的 结 果 整 数 判 别 符 : 注 意 : 以 下 符 号 只 能 用 于 正 数 之 间 − e q 等 于 − g t 大 于 − l t 小 于 − g e 大 于 等 于 − l e 小 于 等 于 − n e 不 等 于 [ ] 测 试 : [ ? 输出上一次程序运行的结果 整数判别符: 注意:以下符号只能用于正数之间 -eq 等于 -gt 大于 -lt 小于 -ge 大于等于 -le 小于等于 -ne 不等于 []测试: [ ?eqgtltgelene[][val -gt 1 ] 注意[]和表达式前后都必须要有空格
文件类型判别符:
-d 目录文件
-f 普通文件
-p 管道文件
-l 软连接
-c 字符设备
-b 块设备
-s socket
列:
[ -d test ]
echo $?
字符串长度判别:注意:只能用于字符串
-z 判断字符串是否是空
-n 判断字符串的长度是否是0
[ 字符串1 = 字符串2 ] 判断字符串是否相等,必须用单等号
[ 字符串1! = 字符串2 ] 判断字符串是否相等,必须用单等号
注意:字符1和字符2与等号之间一定要加空格
逻辑运算符:存在短路现象
-a 逻辑与
-o 逻辑或
! 逻辑非
if 语句:
if[ 测试语句 ]; then
执行内容
elif[ 测试语句 ];then // 相当于else if
执行内容
else[ 测试语句 ];then
执行内容
fi //if语句结束

read VAL //当程序执行道这一行会阻塞,等待用户输入,这个语句相当于直接定义了VAL
caes语句:
#! /bin/sh
echo “Is it morning? Please answer yes or no.”
read YES_OR_NO
case “$YES_OR_NO” in
yes|y|Yes|YES) //条件之间用或分开
echo “Good Morning!”;; //;;两个分号相当于break
[nN]*)
echo “Good Afternoon!”;;
*) //相当于default,就是case的最后一个
echo “Sorry, $YES_OR_NO not recognized. Enter yes or no.”
exit 1;;
esac //esac是case结束语句
exit 0
for语句:
相当于foreach
for 变量名 in 集合;do
执行语句
done //语句结束
for text in ‘ls’;do
mv $text text.aaa
dnoe

批量修改当前目录文件的名字:
#!/bin/bash
for txt in ls;do
mv $txt $txt.c
done
批量删除当前文件中所有的文件:
#!/bin/bash
for txt in ls;do
rm -rf $txt
done
while循环语句模板:
while [判断条件]; do
执行语句;
done //结束语句
while语句判断密码是否正确:
#!/bin/bash
read mima
while [ 0 ];do
if [ $mima = “nihao” ];then
echo “good”
exit 0
else
echo “try again”
fi
read mima
done
命令行参数:
$0 相当于argv[0],一般显示脚本文件名字
$1 相当于argv[1], 传入脚本的第一个参数
$2 相当于argv[2], 传入脚本的第二个参数
$3 相当于argv[3], 传入脚本的第三个参数
$# 除了文件名这个参数剩余的参数的个数
如: ./a.sh aa bb cc dd $#=4
$@ 表示$0 $2 $3 ……,展示所有的参数,可以在for循环,for TXT in $@
∗ 与 * 与 @相同,但是$*除了$0
$$ 取出当前进程的编号
shift 左移命令,但是$0不参与移动

管道:
可以通过 | 把一个命令的输出传递给另一个命令做输入。
cat myfile | more
ls -l | grep “myfile”
df -k | awk ‘{print $1}’ | grep -v “文件系统”
df -k 查看磁盘空间,找到第一列,去除“文件系统”,并输出
重定向:
cmd > file 把标准输出重定向到新文件中
cmd >> file 追加
cmd > file 2>&1 标准出错也重定向到1所指向的file里
cmd >> file 2>&1
cmd < file1 > file2 输入输出都定向到文件里
列:cat < a.sh > out2 将a.sh文件读进out2文件中
cat out2 输出out2文件的内容
cmd < &fd 把文件描述符fd作为标准输入
cmd > &fd 把文件描述符fd作为标准输出
cmd < &- 关闭标准输入
函数:
注意:函数定义中没有返回值,也没有参数列表,但是函数可以短传递参数
函数的定义:
函数名()
{
函数体
}
函数调用:
foo
列:
#!/bin/bash
foo()
{
for txt in $@;do
ls -l $txt
done
}
echo “----start----”
foo $@
echo “----end----”
命令行:./a.sh a.sh b.sh (文件名)
在函数中$0还是脚本名字,但是$1、$2、$3、$4不是来的含义,是函数传进去的参数
#!/bin/bash
foo()
{
echo $0
echo $1
echo $2
echo $3
}
echo “----start----”
foo 11 22 33
echo $0
echo $1
echo $2
echo $3
echo “----end----”
命令行:./a.sh aa bb cc
输出:
----start----
./a.sh
11
22
33
./a.sh
aa
bb
cc
----end----
shell脚本调试:
跟踪调试:
sh -x ./脚本名字
或者在脚本的第一行加#!/bin/bash -x
分块调试:
#!/bin/bash
foo()
{
set -x //调试开始
echo $0
echo $1
echo $2
echo $3
set +x //调试结束
}
echo “----start----”
foo 11 22 33
echo $0
echo $1
echo $2
echo KaTeX parse error: Can't use function '\.' in math mode at position 70: …ep '^[0-9]{1,3}\̲.̲[0-9]{1,3}\.[0-…’ test
注释:
$ 表示完毕,结束
./ 为转义,将.转义
[0-9] 为0-9之内的数字
{1,3} 是前面的条件出现的次数
正则表达式和shell中匹配字符的方式不一样
在shell中匹配任意一个字符是用?(问号)
在正表达式匹配任意一个字符是用.(点)
[] 表示[]中的任意一个,里面可以是字符,也可以是范围
列如:
[ABC] 表示匹配ABC中的一个字符
[0-9] 表示匹配0-9范围的数字
^ 取反
1 表示除了0-9的所有字符
数量限定符:
? 紧跟在它前面的单元匹配0次或1次

  •    紧跟在它前面的单元匹配1次或多次
    
  •    紧跟在它前面的单元匹配0次或多次
    

{n} 紧跟在它后面的单元精确匹配n次
{n,} 紧跟在它后面的单元至少匹配n次
{,m} 紧跟在它后面的单元至多匹配n次
{n,m} 紧跟在它后面的单元至多匹配n-m次
注意:正则表达式匹配的是包含的那个数据,而不是完全是那一行的数据
位置限定符:
^ 表示开头
$ 表示结束
列如:
.$ 意思是以.结尾
<th 意思是匹配开头是th的单元
th> 意思是匹配结尾时th的单元
\bth 意思是匹配以th开头的单元
th\b 意思是匹配以th结尾的单元
列:
\bth\b 匹配的是th本身
匹配IP地址的几种方法:
egrep ‘^([0-9]{1,3}.){3}[0-9]{1,3}KaTeX parse error: Can't use function '\.' in math mode at position 26: …ep '^[0-9]{1,3}\̲.̲[0-9]{1,3}\.[0-…’ test
其他字符:
\ 转义字符
() 改变优先顺序
| 将两个表达式连接在一起
Basic和Extended正则表达式之间的区别:
以上介绍的是grep正则表达式的Extended规范,Basic规范也有这些语法,只是字符?+{}|()应解释为普通字符,要表示上述特殊含义则需要加\转义。如果用grep而不是egrep,并且不加-E参数,则应该遵照Basic规范来写正则表达式。
如果没有egrep 那么就用 grep -E 查询
grep的使用方法:
grep -r “8.8.8.8” ./ 查询8.8.8.8在子目录中的那个文件中
grep -r “8.8.8.8” ./ -n 查询8.8.8.8在子目录中的那个文件中,并且显示行号


  1. 0-9 ↩︎

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值