【Shell编程-2】算术运算、字符串与文件操作精通

前言

之前我们学习了 Shell的历史与其基本命令,以及Shell的变量与常量,接下来学习其基本运算


基本运算

在 Shell 编程中,除了变量管理和控制流结构外,运算是处理数据的核心部分。Shell 提供了多种运算方式,涵盖了算术运算、字符串操作和文件目录操作等。

算术运算

算术运算是最常用的操作之一。Shell 提供了两种常用方式来进行算术计算:expr 命令和 $(( )) 表达式。

使用 expr 进行算术运算

expr 是一个外部命令,用于进行算术计算。我们可以用它来执行加、减、乘、除和取余等基本运算。注意,expr 要求操作数和运算符之间必须有空格。

# 加法
result=$(expr 5 + 3)
echo $result  # 输出:8

# 减法
result=$(expr 10 - 3)
echo $result  # 输出:7

# 乘法
result=$(expr 5 \* 4)  # 乘号需要转义
echo $result  # 输出:20

# 除法
result=$(expr 10 / 2)
echo $result  # 输出:5

# 取余
result=$(expr 10 % 3)
echo $result  # 输出:1

使用 (( )) 进行算术运算

(( )) 是一种内建的算术扩展方式,支持更直接的运算,且不需要转义符号。它通常被认为是更简洁和高效的方式,尤其是在Shell脚本中。

# 加法
result=$((5 + 3))
echo $result  # 输出:8

# 减法
result=$((10 - 3))
echo $result  # 输出:7

# 乘法
result=$((5 * 4))
echo $result  # 输出:20

# 除法
result=$((10 / 2))
echo $result  # 输出:5

# 取余
result=$((10 % 3))
echo $result  # 输出:1

使用 bc 进行浮点数运算

Shell 默认不支持浮点数运算。如果需要进行浮点运算,可以使用 bc(Basic Calculator)工具,它支持浮点数的计算。

# 使用 bc 计算浮点数
result=$(echo "scale=2; 10.5 / 3" | bc)
echo $result  # 输出:3.50

字符串操作

Shell 也支持对字符串的操作,常见的操作包括拼接、获取字符串长度、提取子串等。

字符串拼接

在 Shell 中,字符串拼接非常简单,只需要将两个字符串直接放在一起即可。

str1="Hello"
str2="World"
result="$str1 $str2"
echo $result  # 输出:Hello World

获取字符串的长度

可以使用 ${#variable} 获取字符串的长度。

str="Hello World"
length=${
    
    #str}
echo $length  # 输出:11

提取子串

Shell 允许通过指定起始位置和长度来提取子串。可以使用 ${string:start:length} 来提取子串。

str="Hello World"
substr=${str:0:5}   # 从索引 0 开始,提取 5 个字符
echo $substr  # 输出:Hello

字符串替换

可以使用 ${string//search/replace} 语法进行全局替换,或者 ${string/search/replace} 进行单次替换。

str="Hello World"
result=${str/World/Shell}   # 将第一次出现的 World 替换为 Shell
echo $result  # 输出:Hello Shell

# 全部替换
result=${str//o/O}  # 替换所有 'o' 为 'O'
echo $result  # 输出:HellO WOrld

文件和目录操作

Shell 提供了内建命令 test[ ] 用于对文件和目录进行检查。这些命令可以用于检查文件或目录是否存在、是否具有读取、写入或执行权限等。

文件存在性检查

可以使用 -e 来检查文件是否存在。

if [ -e "file.txt" ]; then
  echo "文件存在"
else
  echo "文件不存在"
fi

文件类型检查

可以使用 -f 检查文件是否为普通文件,使用 -d 检查是否为目录,使用 -L 检查是否为符号链接。

if [ -f "file.txt" ]; then
  echo "这是一个普通文件"
elif [ -d "dir" ]; then
  echo "这是一个目录"
elif [ -L "link" ]; then
  echo "这是一个符号链接"
else
  echo "文件类型不明确"
fi

文件权限检查

可以使用 -r 检查文件是否可读,使用 -w 检查文件是否可写,使用 -x 检查文件是否可执行。

if [ -r "file.txt" ]; then
  echo "文件可读"
else
  echo "文件不可读"
fi

文件空检查

可以使用 -s 来检查文件是否为空(文件大小大于零)。

if [ -s "file.txt" ]; then
  echo "文件非空"
else
  echo "文件为空"
fi