1、沙棒#!
查看系统支持的shell:
2、变量引用
格式
$变量名
${变量名}
单反引号(`)
单反引号用来优先执行某系些行为,获取其结果
弱引用 vs 强引用
弱引用("")会识别字符串中的变量,将其替换,反之强引用认为单反是包含在''内的都为字符串,除非参数控制
3、条件判断
1、基本语法
if [ $1 -eq 1 ]
then
echo "------"
fi
2、多层判断
if [ $1 -eq 1 ]
then
echo "------"
else [ $1 -eq 2 ]
then
echo "+++++++"
else
echo "=========="
fi
3、正则匹配
a='123'
if [[ "$a" =~ "4" ]]
then
echo "存在2"
else
echo "不存在"
fi
4、for 循环
1、循环数组:
a=(1 2 3 4 5 6)
for i in ${a[*]}
do
echo "$i"
done
2、自定义数字列表
for i in `seq 10`
do
echo "$i"
done
case语法
count1=$1
case $count1 in
1) echo "today is Monday";;
2) echo "today is Tuesday";;
3) echo "today is Wednesday";;
4) echo "today is Thursday";;
5) echo "today is Friday";;
6) echo "today is Saturday";;
7) echo "today is Sunday";;
*) break;;
esac
位置参数
1、执行文件名后追加参数,根据空格分隔,脚本内部通过$1-$9回去对应位置的参数
2、位置参数超过10的时候,脚本内部获取参数要用{}括起来
5、函数
1、提前定义
2、function关键字存在的时候,函数名后的()可有可无,反之必须存在
3、语法结构:
function varname(){
代码块
}
函数传参:
1、同样支持位置变量,在函数内部通过 $1 $2....方式获取
2、函数内部无法通过${1..10}获取外部传入变量,必须通过自定义变量先获取到外部变量,然后在函数内部引用自定义计量的方式
6、删除
删除是shell脚本最危险的一种操作,删除资源的时候带上绝对路径/相对路径
1、严禁直接使用rm -rf *
2、尽量减少通配符的使用
7、嵌套python
b=123 python3 - <<EOF print("https://www.baidu.com?a={}".format($1)) EOF
8、sed
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等
参数:
- -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
#在file.log文件的第四行后添加一行,并将结果输出到标准输出
sed -e 4a
ewLine file.log
#多点编辑
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/'
- -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
动作:
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
nl /etc/passwd | sed '2a test 123' #第3行插入”test 123“
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
nl /etc/passwd | sed '2,5c test 123' #将第2-5行的内容取代成为test 123
- d :删除,所以 d 后面通常不接任何东西
nl /etc/passwd | sed '3,$d' #删除3到最后一行 nl /etc/passwd | sed '/root/d' #删除有root关键字的行
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
nl /etc/passwd | sed '2i test 123' #第2行插入”test 123“
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
nl /etc/passwd | sed '/root/p' #搜索 /etc/passwd中有root关键字的行
- s :取代,可以直接进行取代的工作, s 的动作可以搭配正则,例如 1,20s/old/new/g
sed 's/正则字串/新的字串/g'
9、awk
AWK 是一种处理文本文件的工具,以下为常见的几种用法
# 每行按空格或TAB分割,输出文本中的1、4项
awk '{print $1,$4}' log.txt
# 使用","分割
awk -F, '{print $1,$2}' log.txt
# 设置变量a=1awk -va=1 '{print $1,$1+a}' log.txt
# 过滤第一列大于2并且第二列等于'Are'的行 ($1表示第一列,可结合运算符使用)
awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt