Shell脚本编程基础第六天之--基本算术运算、字符串操作

189 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

一、基本算术运算

  • 使用$((expression))算术运算符表达式,注意这种方式只支持整数运算
A=3
B=$((100 * A + 5))# 305
  • a + b addition (a plus b);a加上b
  • a - b substraction (a minus b);a减去b
  • a * b multiplication (a times b);a乘以b
  • a / b division (integer) (a divided by b);a除以b,由于只支持整数运算,除法可能会出问题
  • a % b modulo (the integer remainder of a divided by b);a除以b的整数余数
  • a ** b exponentiation (a to the power of b);a的b次幂

image.png

image.png

都是比较简单的,除了除法是整数运算导致精度丢失问题。

当然了,还是有办法解决的,引入其他的工具be

a是bc的一个内置函数,代表反正切arctan,由于tan(pi/4)=1,于是4 * arctan(1) = pi,即圆周率

image.png

image.png

当然了,关于be的工具还有很多方法,这里不会一一列举。

二、字符串操作

直接上脚本

# 注意非拉丁语系字符串长度计算
M_STRING="中文"
export LANG=C.UTF-8 # 设置UTF-8
echo ${#M_STRING} # 2,认为是2个长度
export LANG=C # 默认用单字节长度
echo ${#M_STRING} # 6,认为是6个长度字节--一个中文字符占3个字节

在本地命令行直接使用命令:

image.png

在某些线上环境使用命令:

image.png

注意到了使用 export LANG=C的时候,输出长度有所区别

(在线环境)使用locale查看只有Lang变成了C

image.png

(虚拟机环境)但是在虚拟机环境使用locale查看,全变成了C

image.png

而真正影响环境的变量是LC_ALL,比如在线环境修改一下,确实输出6个字节了

image.png

vim 9-1.sh

#!/bin/bash
  
# 获得字符串长度值
STRING="this is a string"
echo ${#STRING} # 16

# 注意非拉丁语系字符串长度计算
M_STRING="中文"
export LANG=C.UTF-8 # 设置UTF-8
echo ${#M_STRING} # 2,认为是2个长度
export LANG=C # 默认用单字节长度
echo ${#M_STRING} # 6,认为是6个长度字节--一个中文字符占3个字节

# 字符串截取子串
STRING="this is a string"
POS=1
LEN=3
echo ${STRING:$POS:$LEN} # his,表示截取第1到第3,
echo ${STRING:1} # $ his is a string,表示截取第1到末尾

echo ${STRING:12} # ring,表示截取第12到末尾

# 注意非拉丁语系字符串截取
export LANG=C
echo -n "${M_STRING:0:1}" | xxd -p # e4,xxd表示以16进制输出
export LANG=C.UTF-8
echo -n "${M_STRING:0:1}" | xxd -p # e4b8ad

# 字符串查找并替换第一次匹配到的子串
STRING="to be or not to be"
echo ${STRING[@]/be/eat} # to eat or not to be,将遇到的第一个be替换成了eat

输出,上面的注释已经写清楚了

image.png

Shell脚本编程基础第七天之--条件判断