shell编程


一、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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzhlizihang

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值