文章目录
一、shell编程基础
01、变量
your_name="lizihang" //不能有空格
echo $name //打印变量
unset your_name //删除变量
readonly your_name //只读变量
02、字符串
定义变量可以使用单引号或者双引号,但是使用变量只能使用双引号
skill="java" //定义变量 单引号和双引号都可以
echo $skill //打印的是java
echo '$skill' //单引号 打印的是$skill
echo "$skill" //双引号 打印的是java
echo ${#skill} //打印该字符串的长度
echo ${skill:2} //字符串截取
expr index "$skill" a //查找字符串 返回索引位置
03、参数
#!/bin/bash
echo "查看shell脚本中的参数"
echo "目前正在执行的脚本的名字是:$0"
echo "获取到的第一个参数是:$1"
echo "获取到的第二个参数是:$2"
echo "获取到的第三个参数是:$3"
echo "总共有几个参数:$#"
echo "这些参数分别是什么:$*
04、运算符
a=2
b=3
echo $((a + b)) //可以
echo $(($a + $b)) //也可以
05、流程控制 (if else switch)
-eq:是否相等 -ne:是否不相等 -gt:是否大于
-lt:是否小于 -ge:是否大于等于 -le:是否小于等于
#!/bin/bash
a=$1
b=$2
if [ $a -gt $b ];then
echo "a大于b"
fi
if [ $a -lt $b ];then
echo "a 小于 b"
fi
if [ $a -eq $b ];then
echo "a等于b"
fi
06、 读取我们控制台的数据
read -p “请输入您的姓名:” name
#!/bin/bash
read -p "请输入用户名:" name
read -p "请输入密码:" password
if [[ $name = 'root' && $password = '123456' ]]; then
echo "登录成功"
else
echo "登录失败"
fi
比较数字,使用 -eq
比较字符串 使用 = 或者 ==
假如有多个条件,使用 [[ ]]
07、脚本
将这个脚本放在如下位置:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
具体放在/usr/local/sbin:/usr/local/bin ,因为这两个文件夹中没有任何的可执行文件,所以一般存放咱们自己的脚本非常合适。为什么放在这四个里面就可以?因为这四个目录默认被Path 加载。
一般自己编写的脚本放在:
/usr/local/sbin
/usr/local/bin
08、for循环
for 变量 in (list); do
// 编写执行的语句
done
#!/bin/bash
num=0
for i in 1 2 3 4 5;do
num=$[i+num]
done
echo $num
echo "---------------------"
for i in {1..100};do
if [ $[i%2] -eq 0 ];then
echo "$i是偶数"
fi
done
09、while循环
while 条件; do
执行语句
done
// 死循环
while true; do
执行语句
done
// 每隔一秒钟打印一个当前时间
#!/bin/bash
while true; do
date
sleep 1
done
10、switch
#!/bin/bash
read -p "请输入1~7之间的数字" num
case $num in
1)echo "星期一";;
2)echo "星期二";;
3)echo "星期三";;
4)echo "星期四";;
5)echo "星期五";;
6)echo "星期六";;
7)echo "星期日";;
esac
11、函数
//没有参数和返回值
function showName(){
echo "该方法被调用了"
}
//有参数无返回值
function showName2(){
echo "第一个参数$1"
echo "查看所有参数$*"
}
//有参数有返回值
function showName3(){
echo "第一个参数$1"
echo "第二个参数$2"
return $[$1+$2]
}
//无参数有返回值
function showName4(){
return "abc"
}
//调用
showName
showName2 100 200 300
showName3 100 200
result=$?
echo $result
showName4
result2=$?
echo $result2
12、数组
bash中,只支持一维数组,不支持多维数据。
数组的名字=(val1 val2 val3 …)
#!/bin/bash
echo "使用第一种方式循环:"
my_arr=(AA BB CC)
for str in ${my_arr[*]};do
echo $str
done
echo "使用第二种方式循环:"
length=${#my_arr[*]}
for((i=0;i<length;i++));do
echo ${my_arr[$i]}
done
13、脚本文件相互加载
source ./xxx.sh #加载文件中的内容
14、cut 提取
准备数据 01.txt:
111:aaa:bbb:ccc
222:ddd:eee:fff
333:ggg:hhh
444iii
cut -d ‘分隔符’ -f n1,n2 //指定分隔符 分割以后显示第几列内容
cut -d ':' -f 1,2 01.txt 111:aaa
222:ddd
333:ggg
444iii
cut -c //按字符选取内容
cut -c 5 01.txt
a
d
g
i
cut -c 4 01.txt
:
:
:
i
15、sort 排序
sort -u //去重并按照'字符串'排序规则排序
sort -r //倒序排序
sort -n //按照数值大小进行排序
sort -t //指定字段分隔符(结合 -k 使用)
sort -k //根据哪一列进行排序
16、wc 单词统计
wc 跟上文件名 显示文件的字节数,单词数,文件的行数
wc -c //显示一个文件的字节数
wc -w //显示一个文件的单词数
wc -l //显示一个文件的行数
17、awk
awk 可以实现模糊查询,按需截取字符串,进行判断以及简单的运算
awk '/搜索字符/' score.txt //模糊查询
awk -F ',' '{print $1,$2, $3}' 文件名字 //根据 逗号 分割, 打印 第一段 第二段 第三段 内容
awk -F //使用指定字符分割
print $+数字 //打印第几段内容
print NF //打印当前行共有多少个字段
awk -F ':' '{OFS="=== "}{print 2, $3}' 01.txt //将打印出来的内容添加分隔符===
#awk中使用函数
toupper() //字符 转成 大写
tolower() //字符 转成小写
length() //返回 字符长度
awk -F ',' '{print toupper($2)}' 01.txt //操作01.txt文件, 将某一列的数据变为大写
#awk中添加条件判断
awk -F ' ' '{if($2>=60) print "及格",$1,$2;else print "不及格",$1,$2}' 4.txt
#awk中进行begin,end语句
cat 4.txt | awk -F ' ' 'BEGIN{print "开始计算成绩总和"}{total=total+$4}END{print total}'
//它是由三部分组成的
//BEGIN{} 这一部分只执行一次
//END{} 该代码块中的语句也只执行一次
//中间{} 每读取一行数据,就执行一次
18、sed操作 --实现过滤和替换
nl 01.txt //查看01.txt文件,该文件自动添加行号
sed -n //仅显示处理后的结果
sed -e //根据表达式 进行处理
sed p //打印
sed $ //代表 最后一行
sed = //打印当前行号
sed -n -e '2,$p' -e '2,$=' 01.txt //打印的是文件中第二行到最后一行的内容 并打印行号
// -e 后面可以跟'查找表达式' 也可以跟'正则表达式'
sed d //删除指定行数据
sed -e '3,5d' //选项使用d 删除3到5行数据
sed i //目标前面 插入内容
nl 01.txt | sed -e '1i xxxxxxxx' //在01.txt第一行前面插入xxxxxxx,并显示行号
sed a //目标后面 追加内容
nl 01.txt | sed -e '2a SSSSSSSS' //在01.txt第二行后面插入xxxxxxx,并显示行号
sed c //替换
sed -e '2c xxxxxx' 01.txt //将01.txt文件中第二行的数据替换成xxxxxx
19、split 文件切割
split -b //按照文件大小进行切割 单位为byte
split -l //按照行进行切割
20、tr 替换和删除
tr 要被替换的字符 新字符
tr -d 要被删除的字符 //删除指定字符
tr '[a-z]' '[A-Z]' //将所有小写字母换成大写字母
21、uniq 去重
uniq 命令用于检查及删除文本文件中重复出现的行,一般与 sort 命令结合使用
uniq -c //对重复数据计数
sort | uniq //去重并排序
22、tee 数据输送
cat 01.txt | sort | uniq | tee a.txt b.txt //将01.txt数据传输到a.txt和b.txt中
23、补充
假设有个变量:file=/dir1/dir2/dir3/my.file.txt
${file#*/}:取第一个/右边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:取最后一个/右边的字符串:my.file.txt
${file#*.}:取第一个. 右边的字符串:file.txt
${file##*.}:取最后一个. 右边的字符串:txt
${file%/*}:取最后一个 / 左边的字符串:/dir1/dir2/dir3
${file%%/*}:取第一个/ 左边的字符串:(空值)
${file%.*}:取最后一个. 左边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:取第一个. 左边的字符串:/dir1/dir2/dir3/my