shell基础知识

本文详细介绍了Shell脚本的基础知识,包括echo命令的使用、颜色输出、历史命令、快捷键、重定向、多命令执行、特殊符号解析、变量声明与运算、预定义变量、用户输入、正则表达式和文本处理工具如grep、awk、sed。此外,还讲解了for循环和if条件判断等流程控制结构,为Shell脚本编程提供了全面的指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

echo

echo输出打印

普通输出打印:echo “abc”

使用-e支持控制符号,如 echo -e “\”

echo 颜色输出

  • 字体颜色输出

echo -e “\e[1;31m abc \e[0m”(31m红色、32m绿色、33m黄色 前后\e为固定格式)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IsFvhJ5T-1653356782873)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328111439102.png)]

  • 背景颜色输出

echo -e “\e[1;41m abc \e[0m” (41m红色背景、42m绿色、43m黄色)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B94glArD-1653356782874)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328111536371.png)]

shell脚本程序运行方法

  • 新建shell脚本文件,注意顶部一定要加bash bang( #!/bin/bash )
  • 赋执行权限:chmod 755 hello.sh
  • 通过当前路径或者绝对路径执行:./hello.sh 或者 sh hello.sh

历史命令

History 记录在~/.bash_history history -w历史命令强行写入配置文件

重复执行第n条历史命令: !39(39为history命令打印出来的历史命令的序号)

清空历史命令:history -c

常用快捷键

移动到首位 Ctrl A

移动到尾部 ctrl E

剪切光标前内容 ctrl u

输出重定向

覆盖重定向 >

追加重定向 >>

追加的方式把正确和错误输出都保存到文件中:命令 >> 文件 2>&1 (前面表示把输出到追加到文件中,后面表示把标准错误输出到标准正确输出中),或者使用 命令 &>> 文件 命令(更常用)

多命令执行

命令1 ;命令2 ;命令3(多条命令顺序执行)
命令1 && 命令2 (命令1正确执行后命令2才执行,命令1报错,命令2不执行)
命令1 || 命令2 (命令1不正确执行命令2才执行,命令1正确执行,命令2不执行)

bash shell的特殊符号

  1. 单引号中的特殊符号都没有特殊含义。
  2. 双引号中的特殊符号都没有特殊含义,但是$、` 、\例外,拥有调用变量值,引用命令,转义符的特殊含义。
  3. 反引号中的为系统命令。(需要把命令的值赋予变量的情况下使用。直接使用命令的时候,直接输入回车即可)
  4. $符号用于调用变量的值。
  5. ()自动开启一个子shell并在子shell中执行括号中的命令,执行完以后自动退出子shell。如:(name=1m;echo $name)
  6. {}在当前shell中运行括号中的命令。如:{ name=1m;echo $name; },用得较少,不加括号一样可以执行。
  7. []用于变量测试
  8. #用于注释
  9. \转义符

bash的变量和运算符

1、变量可以由字母、数字和下划线组成,但不能由数字开头。Name=sc

image-20220328114624165

2、变量默认类型都是字符串,如果需要数值运算,则必须指定特定变量类型为数值型。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WZaOCEoU-1653356782875)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328114809525.png)]

3、shell语言中变量定义赋值的时候,等号=左右两侧不能加空格。

image-20220328114422199

用户自定义变量

  • 【变量查看】

set -u 调用未声明变量时会报错,临时生效,永久生效写入环境变量配置文件

set -x 在执行命令之前,会把命令先输出一遍(不常用)

set 查看系统所有变量 包括系统变量和自定义变量

  • 【变量删除】

unset 变量名

  • 【更细覆盖】

重新赋值即可覆盖

环境变量

2.1 用户自定义环境变量

用户自定义环境变量可以在父shell和子shell中生效,用户自定义变量只能在当前shell中生效。

用户自定义环境变量格式 export AGE=22

【环境变量查询】

set 可查看包含环境变量的所有变量,env查看所有环境变量

【环境变量删除】

Unset

【环境变量修改】

覆盖

2.2 系统自带环境变量

变量名称、作用均不能修改

【PATH系统环境变量】

PATH变量:系统查找命令的路径

系统命令不需要加绝对路径或者相对路径就可以运行的原因就是PATH环境变量的作用。

【PS1系统环境变量】

用来定义命令行的提示符

位置参数变量

$n 第n个命令行参数

$* 代表命令行所有参数,把所有参数看成一个整体

$@代表命令行所有参数,把每个参数区分对待

$#命令行所有参数个数

#!/bin/bash
num1=0
num2=0
for i in "$*"
        do
                echo $i
                num1=$((num1+1))
        done

echo "================================================="

for j in "$@"
        do
                echo $j
                num2=$((num2+1))
        done

echo "==============================================="

echo $num1  $num2

预定义变量

$? 最后一次执行的命令的返回状态。0上一条命令执行正确,非0上一条命令执行不正确

接收键盘输入

read [选项] [变量名]

-p 提示信息

-t 秒数,输入等待时间

-s 隐藏输入数据

-n 指定字符数

echo "begin input your userinfo"
read -t 30 -p "please input name:" name
read -t 30 -p "please input age:" age
echo "your username is $name,your age is $age"

read -s -t 30 -p "please input passwd" passwd
echo "your passwd is $passwd"

echo "begin add"

read  -t 30 -p "please input num1[0/1]:" num1
echo -e "\n"
read  -t 30 -p "please input num2[2/3]:" num2
echo -e "\n"

echo "num1 和 num2的和为:$(($num1+$num2))"

变量声明与运算

declare声明变量类型

shell中默认都是字符串类型,需要单独进行数值运算就需要单独进行类型定义
declare [+/-] 变量名
-:给变量设定类型属性
+: 取消变量的类型属性

-a:将变量声明为数组型 declare -i c= a + a+ a+b 数值运算更常用方法 ( ( (( ((a+$b))

-i: 将变量声明为整数型 declare -a name[0]=“lizhencai” 或者 name[1]=“zhangsan”,数组调用 echo ${name[*]} 、echo ${name[1]}

数值运算方法

1、declare进行数值运算 declare -i c= a + a+ a+b

2、使用expr或者let命令工具进行运算

$(expr $a + $b),加号左右两侧必须有空格
let c=$a+$b

3、**使用 ( ( 运 算 式 ) ) , 推 荐 使 用 方 式 ∗ ∗ 。 或 者 使 用 ((运算式)),推荐使用方式**。或者使用 (())使使[运算式]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9fQxEXSc-1653356782876)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328141149008.png)]

四则运算练习题

#!/bin/bash
read -p "请输入第一个运算数字:" num1
read -p "请输入第二个运算数字:" num2
read -n 1 -p "请输入运算表达式[+、-、*、/]:" operator
echo -e "\n"
[ "$operator" == "+" ] && echo "$num1 $operator $num2的运算结果为:$(($num1 $operator $num2))" && exit
[ "$operator" == "-" ] && echo "$num1 $operator $num2的运算结果为:$(($num1 $operator $num2))" && exit
[ "$operator" == "*" ] && echo "$num1 $operator $num2的运算结果为:$(($num1 $operator $num2))" && exit
[ "$operator" == "/" ] && echo "$num1 $operator $num2的运算结果为:$(($num1 $operator $num2))" && exit
echo "请输入正确运算符!"

正则表达式

基础正则表达式

通过grep命令进行加载

  • “*”:前一个字符重复0次或者任意多次

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pfus413f-1653356782877)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328172630468.png)]

  • “.”:匹配除了换行符外任意一个字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GYOqRM4p-1653356782877)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328172411135.png)]

  • grep “.*” [文件名] 匹配任意字符

  • “^”:匹配行首

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kYSqVJML-1653356782877)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328173302923.png)]

  • “$”:匹配行尾

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Q6N8TQH-1653356782878)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328173337769.png)]

  • 匹配空白行 grep “^KaTeX parse error: Expected group after '^' at position 19: …排除空白行 grep -v "^̲

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDHeGCF5-1653356782878)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328173829994.png)]

  • “[]”:匹配括号中任意一个字符,一个字符。如,grep “s[ao]id” test.txt,要么匹配a、要么匹配o
  • “[]”:匹配除括号中字符以外的任意一个字符(取反),注意:[]表示匹配以括号中任意一个字符开头的行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hdp1xHiN-1653356782879)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328175223816.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-alYowxRl-1653356782880)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220328175302360.png)]

  • “\{n\}” 前面的字符恰好出现n次,这里的"\"表示转义,常用于数字的匹配查找
grep "[0-9]\{2\}" test.txt    #数字出现两次的行
grep "[1][3-8][0-9]\{9\}" test.txt    #匹配手机号
  • “\{n,\}” 前面的字符恰好出现大于等于n次

  • “\{n,m\}” 前面的字符恰好出现大于等于n次,小于等于m次

扩展正则表达式

  • “?” 前一个字符匹配0次或者1次
  • “+” 前面字符重复最少一次

正则实例

过滤ip地址

^(([1-9]\.)|([1-9][0-9]\.)|([1][0-9][0-9]\.)|([2][0-5][0-5]\.))(([0-9]\.)|([1-9][0-9]\.)|([1][0-9][0-9]\.)|([2][0-5][0-5]\.)){2}(([0-9])|([1-9][0-9])|([1][0-9][0-9])|([2][0-5][0-5]))$

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AXrWDwMD-1653356782880)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220329115127291.png)]

字符截取和替换命令

cut截取列(grep是提取行)

cut -f n 文件名 提取文件中的第n列

cut -d “:” -f 1 -d按照分隔符进行提取,不支持空格作为分隔符

awk编程

awk的打印
  • printf格式输出

提取根目录磁盘占用情况

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mQUt59IE-1653356782880)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220329145117829.png)]

awk的条件
  • BEGIN 程序执行前执行一次

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ggqA6LX3-1653356782881)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220329150532758.png)]

  • END 程序执行后执行一次

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tMvmvO8d-1653356782881)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220329161503890.png)]

  • 关系运算符
grep -v "name" student.sh | awk '$5 >= 86 {print $1}'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2rlicb8Q-1653356782882)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220329161852231.png)]

  • A~B A包含在B中
  • A!~B A不包含在B中

sed 命令

用于数据选取、替换、删除、新增的命令。

sed [选项][动作]’ 文件名
【选项】:
-n:只会把经过sed命令处理的行输出到屏幕
-e:允许对输入数据应用多条sed命令编辑
-f 脚本文件:从sed脚本读入sed操作。和awk命令的-f非常类似
-r:从sed中支持扩展正则表达式
-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输入
【动作】:
a \:追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要加\代表数据未完结。
c \:行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需要加上\代表数据未完结。
i \: 插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用\代表数据未完结。
d: 删除,删除指定的行。
p: 输出打印指定行
s: 替换字符串
sed -n 输入指定的处理的行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6P2v7nq6-1653356782882)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220330100305488.png)]

  • 文本替换
sed 's/li/mm/g' student.txt   #将student文件中的li替换成mm
sed 's/zhangsan/lisi/g ; s/79/84/g' student.txt  #多条件同时替换

条件判断

文件类型判断

-d 文件:判断文件是否存在,并且是否为目录文件(是目录为真)
-e 文件:判断文件是否存在(存在为真)
-f 文件:判断文件是否存在,并是否为普通文件(为普通文件为真)

整数之间比较

整数1 -eq 整数2   #判断整数1和整数2是否相等(相等为真)、
-ne:是否不相等
-gt:是否大于
-lt:是否小于
-ge:是否大于等于
-le:是否小于等于

字符串的判断

字符串1 == 字符串2 :判断字符串1和字符串2是否相等
!= :是否不等
-n :判断字符串是否为非空,非空为真
-z :判断字符串是否为空,为空为真

流程控制

if条件判断

if  [ 条件判断式 ]
	then
		程序
fi

双分支if语句

if  [ 条件判断式 ]
	then
		程序1
	else
		程序2
fi

多分支if语句

if  [ 条件判断式 ]
	then
		程序1
elif
	then
		程序2
else
	程序3	
fi

实例(简单四则运算器)

#!/bin/bash
read -p "请输入第一个运算数字:" num1
read -p "请输入第二个运算数字:" num2
read -p "请输入运算表达式[+、-、*、/]:" operator

#输入内容非空
if [ -n "$num1" ] && [ -n "$num2" ] && [ -n "$operator" ]
    then
    #判断输入运算数字是否为合法数字
    temp1=$(echo $num1 | sed 's/[0-9]//g')
    temp2=$(echo $num2 | sed 's/[0-9]//g')
    if [ -z $temp1 ] && [ -z $temp2 ]
        then
        if [ "$operator" == "+" ] || [ "$operator" == "-" ] || [ "$operator" == "*" ]
            then
            echo -e "\e[1;32m $num1 $operator $num2的运算结果为:$(($num1 $operator $num2)) \e[0m"
        elif [ "$operator" == "/"  ]
            then
            if [ $num2 -eq 0 ]
                then
                echo -e "\e[1;32m 错误!(除法运算分母不能为0) \e[0m"
            else
                echo -e "\e[1;32m $num1 $operator $num2的运算结果为:$(($num1 $operator $num2)) \e[0m"
            fi
        
        else
            echo -e "\e[1;31m 请输入合法的运算表达式!\e[0m"
        fi

    else
        echo -e "\e[1;31m 请输入合法的运算数字!\e[0m"

    fi
else
    echo -e "\e[1;31m 输入内容不能为空!\e[0m"

fi
exit

for循环

for i in 值1 值2 值3
	do
		程序
	done
for (( i=1;i<=100;i=i+1 ))
	do
		程序
	done
           then
            echo -e "\e[1;32m 错误!(除法运算分母不能为0) \e[0m"
        else
            echo -e "\e[1;32m $num1 $operator $num2的运算结果为:$(($num1 $operator $num2)) \e[0m"
        fi
    
    else
        echo -e "\e[1;31m 请输入合法的运算表达式!\e[0m"
    fi

else
    echo -e "\e[1;31m 请输入合法的运算数字!\e[0m"

fi

else
echo -e “\e[1;31m 输入内容不能为空!\e[0m”

fi
exit






### for循环

```shell
for i in 值1 值2 值3
	do
		程序
	done
for (( i=1;i<=100;i=i+1 ))
	do
		程序
	done
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值