Shell变量全面总结

在这里插入图片描述

本文来自我的博客地址

1. 变量替换

语法解释
${变量#匹配规则}从头开始匹配, 删除最短匹配
${变量##匹配规则}从头开始匹配, 删除最长匹配(贪婪匹配)
${变量%匹配规则}从尾部开始匹配, 删除最短匹配
${变量%%匹配规则}从尾部开始匹配, 删除最长匹配(贪婪匹配)
${变量/旧字符串/新字符串}替换变量, 只替换第一个匹配项
${变量//旧字符串/新字符串}替换变量, 替换所有匹配项

示例:

$ var="I love you, Do you love me"

${变量#匹配规则}

$ var1=${var#*ov}  # 匹配时从第一个字符开始匹配
$ echo $var1

输出:

e you, Do you love me

${变量##匹配规则}

$ var2=${var##*ov}
$ echo $var2

输出:

e me

${变量%匹配规则}

$ var3=${var%ov*}
$ echo $var3

输出:

I love you, Do you l

${变量%%匹配规则}

$ var4=${var%%ov*}
$ echo $var4

输出:

I l

${变量/旧字符串/新字符串}

$ echo $PATH

输出:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
$ var5=${PATH/bin/BIN}
$ echo $var5

输出:

/usr/local/sBIN:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

${变量//旧字符串/新字符串}

$ var6=${PATH//bin/BIN}
$ echo $var6

输出:

/usr/local/sBIN:/usr/local/BIN:/usr/sBIN:/usr/BIN:/sBIN:/BIN:/snap/BIN

2. 变量测试

变量测试实际用得较少, 大多都可以通过if-else替换

变量替换参照表image-20231209180314353

示例:

var=${str-expr}

1. 没有设置变量

$ unset var
$ echo ${var-expr}

输出:

expr

2. 设置变量, 且变量为空

$ var=
$ echo ${var-expr}

输出:

         # 输出空值

3. 设置变量, 且变量非空

$ var=test
$ echo ${var-expr}

输出:

test

3. 字符串处理

计算字符串长度

语法说明
方法一${#string}
方法二expr length “$string”string 有空格,则必须加双引号, (建议加上 “” )

示范

$ str=shellLearning
$ echo ${#str}
# 13
$ echo $(expr length "$str")
# 13

获取字符在字符串中的索引位置

$ expr index "$string" $substring

$ var="kubernetes is popular"  
$ idx=`expr index "$var" t`   # var 中有空格, 加 ""
$ echo $idx
# 8
$ idx=`expr index "$var" te` # 子串会被拆成一个个字符一次匹配, 返回第一个匹配
$ echo $idx
# 4

获取子串长度

$ expr match "$var" substr
# 子串必须从头第一个字符开始匹配
$ var="kubernetes is popular"  
$ idx=`expr match "$var" popu`
$ echo $idx
# 0
$ idx=`expr match "$var" ku.*`
$ echo $idx
# 21

抽取子串

语法说明
${string:position}从 string 中 position 开始到结尾
${string:position:length}从 string 中 position 开始, 匹配长度为 length
${string: -position}从右边开始匹配
${string:(position)}从左边开始匹配
expr substr “$string” $position $length从 string 中 position 开始, 匹配长度为 length

:索引从 0 开始

expr 索引从 1 开始

$ var="kubecetes istio etcd operator"
$ substr=${var:7}
$ echo $substr
# es istio etcd operator

$ substr=${var:7:6}
$ echo $substr
# es ist

$ substr=${var: -7}
$ echo $substr
# perator

$ substr=${var:(-7)}
$ echo $substr
# perator

$ substr=`expr substr "$var" 7 6`
# tes is

脚本练习

思路:

  1. 根据功能划分, 编写响应函数
  2. 实现定义函数
  3. 主流程设计
#!/bin/bash
#

str="Bigdata process framework is Hadoop,Hadoop is an open source project"

function print_tips {
	echo "************************************"
	echo "(1) 打印 string 长度"
	echo "(2) 删除字符串中所有的 Hadoop"
	echo "(3) 替换第一个 Hadoop 为 Mapreduce"
	echo "(4) 替换全部 Hadoop 为 Mapreduce"
	echo "************************************"
}

function len_of_string
{
	echo "${#str}"
}

function del_hadoop
{
	echo "${str//Hadoop/}"
}

function replace_hadoop_mapreduce_first
{
	echo "${str/Hadoop/Mapreduce}"
}

function replace_hadoop_mapreduce_all
{
	echo "${str//Hadoop/Mapreduce}"
}

while true
do
	echo "[string: $str]"
	echo
	print_tips
	read -p "Please input your choice(1|2|3|4|q|Q): " choice
	
	case $choice in
		1)
			len_of_string
			;;
		2)
			del_hadoop
			;;
		3)
			replace_hadoop_mapreduce_first
			;;
		4)
			replace_hadoop_mapreduce_all
			;;
		q|Q)
			exit
			;;
		*)
			echo "Error input, only {1|2|3|4|q|Q}"
			;;
	esac
done

4. 命令替换

  1. 使用 `command`
  2. 使用 $(command)

示例

获取系统所有用户

#!/bin/bash
#

index=1
for user in `cat /etc/passwd | cut -d ":" -f 1` 
do
	echo "This is $index user: $user"
	index=$(($index+1))  # ((index++))
done

获取年份

$ echo $(($(date +%Y) + 1))
# 2024

# 等价
$ echo $((num1+num2))
$ echo $(($num1+$num2))

计算星期

#!/bin/bash
#

echo "Today is the $(date +%j) of year."
echo "This year has passed $(($(date +%j) / 7)) weeks"
echo "This year has $(((365-$(date +%j)) / 7))"

判断进程是否存活

#!/bin/bash
#

nginx_num=$(ps -ef | grep nginx | grep -v grep | wc -l)

if [ $nginx_num -eq 0 ]; then
	systemctl start nginx
fi

有类型变量

declare 与 typeset 命令

两者等价

declare 命令参数表:

image-20231210152406254

与之相反, 取消变量, 把-改为+

5. Bash 数学运算

expr 与 $(())

$(()) : 只可用于加减乘除

参数表

image-20231210154009070

$ num1=17
$ num2=5
$ expr $num1 + $num2
# 22
$ expr $num1 - $num2
# 12
$ expr $num1 \* $num2
# 85
$ expr $num1 / $num2
# 3
$ expr $num1 % $num2
# 2
$ expr $num1 \> $num2      # 真为 1, 假为 0
# 1    
$ expr $num1 \< $num2
# 0

练习:

#!/bin/bash
#

while true
do
    read -p "Pls input a integer: ": num

    expr $num + 1 &> /dev/null     # expr 只支持整数

    if [ $? -eq 0 ]; then
        if [ `expr $num \> 0` -eq 1 ]; then
            for((i=1;i<$num;i++))
            do
                sum=`expr $sum + $i `
            done
            echo "1+2+...+$num = $sum"
            exit
        else
            echo "error not positive"
        fi
    else
        echo "error inlegle input"
    fi
done
bc 只支持指数运算
$ echo "7.6/3.7" | bc
# 2
$ echo "scale=4;7.6/3.7" | bc  # bc 中 scale 为精度
# 2.0540
  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

M·K·T

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

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

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

打赏作者

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

抵扣说明:

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

余额充值