当前位置: 首页 > news >正文

面试 Linux 运维相关问题

标题Q1Shell脚本是什么、它是必需的吗?

Shell脚本是一种用于自动化执行命令行任务的脚本程序,通常运行在Unix/Linux系统的Shell环境中(如Bash)。它通过将多个命令、逻辑控制(如条件判断、循环)和系统功能整合到一个文件中,实现任务的批量处理或复杂操作。

是否必需?

  • 非必需:如果只是简单使用命令行,手动输入命令即可满足需求。
  • 但高度推荐:在以下场景中,Shell脚本能显著提升效率:
    1. 重复性任务(如批量重命名文件、定期备份)。
    2. 系统管理(自动化安装软件、监控资源)。
    3. 复杂流程(组合多个命令,添加逻辑判断)。

示例

#!/bin/bash
# 统计当前目录下所有.txt文件的行数
for file in *.txt; doecho "$file: $(wc -l < "$file") lines"
done

替代方案

  • 其他脚本语言(如Python、Perl)也可实现类似功能,但Shell脚本在直接调用系统命令时更简洁高效。

总结:是否需要取决于任务复杂度,但掌握基础Shell脚本能大幅提升工作效率。

标题Q2什么是默认登录shell,如何改变指定用户的登录shell

默认登录Shell与修改方法

1. 默认登录Shell说明
Linux系统中默认登录Shell由以下因素决定:

  • 发行版策略:Ubuntu/Debian 默认使用 /bin/bash,Alpine Linux 使用 /bin/ash
  • 用户创建规则:通过 /etc/default/useradd 文件中的 SHELL 参数定义

2. 修改用户登录Shell方法
(需root权限)

方法一:chsh 命令

sudo chsh -s /bin/zsh username  # 将username用户的shell改为zsh

方法二:usermod 命令

sudo usermod --shell /bin/fish username  # 修改为fish shell

方法三:手动编辑配置文件

sudo vipw  # 安全编辑/etc/passwd
# 找到用户行,将路径修改为:username:x:1000:1000::/home/username:/bin/sh

关键验证步骤

  1. 检查目标shell是否在合法列表:
cat /etc/shells  # 显示所有可用shell
# 若没有需先安装并添加:echo "/usr/local/bin/my-shell" | sudo tee -a /etc/shells
  1. 立即生效验证:
su - username  # 重新登录测试
echo $SHELL    # 显示当前登录shell
注意事项
系统服务账户不要随意修改shell(如mysql、www-data等)
远程SSH用户修改shell后需重新建立连接才能生效
若/etc/passwd中指定的shell不存在,用户将无法正常登录

标题Q3可以在shell脚本中使用哪些类型的变量?

Shell脚本变量类型详解

在Shell脚本编程中,主要支持以下7类变量:

  1. 局部变量 (Local Variables)
var1="hello"        # 普通定义
function demo() {local var2=100  # 函数内局部变量
}
  1. 环境变量 (Environment Variables)
export PATH="/usr/local/bin:$PATH"  # 全局可访问
env | grep PATH                     # 查看环境变量
  1. 位置参数 (Positional Parameters)
#!/bin/bash
# 执行方式:./script.sh apple banana
echo $0    # 输出脚本名称 → ./script.sh
echo $1    # 第一个参数 → apple
echo $@    # 所有参数列表 → apple banana
  1. 特殊变量 (Special Variables)
echo $$    # 当前进程PID
echo $?    # 上条命令退出码
echo $#    # 参数个数
echo $*    # 所有参数合并为单个字符串
  1. 数组变量 (Array Variables)
colors=("red" "green" "blue")  # 索引数组
echo ${colors[1]}              # 输出 greendeclare -A dict                # 关联数组(Bash4+)
dict["key1"]=100
dict["key2"]=200
  1. 只读变量 (Read-only Variables)
readonly MAX=100
MAX=200  # 报错:MAX: readonly variable
  1. 命令行参数变量
while getopts ":a:bc" opt; docase $opt ina) arg_a=$OPTARG;;  # -a 参数值存入arg_ab) flag_b=true;;    # 处理-b标志esac
done

变量操作技巧

  • 默认值设置:${var:-default}
  • 长度获取:${#string}
  • 子字符串:${string:0:5}
  • 变量删除:unset var_name

作用域示意图

+-----------------------+
|   Environment Vars    | ← 被子进程继承
+-----------------------+
|   Script Global Vars  | ← 整个脚本可见
+-----------------------+
|  Function Local Vars  | ← 仅函数内部可见
+-----------------------+

标题Q4如何将标准输出和错误输出同时重定向到同一位置?

在Shell中实现标准输出(stdout)和错误输出(stderr)合并重定向有以下三种常用方式:

1. 传统格式(兼容所有Bourne shell)

command > output.log 2>&1
  • > 先重定向stdout到文件
  • 2>&1 再将stderr指向stdout的当前位置(即文件)

2. 现代简写(Bash/Zsh专用)

command &> output.log
# 或等价的
command >& output.log

3. 追加模式(保留原文件内容)

# 传统追加写法
command >> combined.log 2>&1# Bash简写追加
command &>> combined.log

管道处理技巧
同时输出到终端和文件:

command 2>&1 | tee combined.log

执行过程分解示例

# 生成两种输出的测试命令
ls exist_file non_exist_file > out.log 2>&1# 结果文件内容示例:
# exist_file
# ls: cannot access 'non_exist_file': No such file or directory

重定向顺序的重要性
错误示范(stderr不会进入文件):

command 2>&1 > output.log
# 分解:
# 1. 2>&1 → stderr指向当前stdout(终端)
# 2. > output.log → stdout重定向到文件

高级用法:全局重定向

# 对整个脚本生效
exec > >(tee -a script.log) 2>&1
echo "正常信息"
ls invalid_file  # 错误信息也会进入script.log

标题Q5shell脚本中“if”语法如何嵌套?

在Shell脚本中实现if条件嵌套需遵循特定的语法结构:

基础嵌套结构

if [ 条件1 ]
thenif [ 条件1-A ]then命令组1else命令组2fi
elif [ 条件2 ]
then命令组3
else命令组4
fi

多层嵌套示例(文件检测)

#!/bin/bash
file="/data/report.log"if [ -e "$file" ]
thenecho "文件存在"if [ -s "$file" ]thenif [ -w "$file" ]thenecho "可写非空文件,开始处理..."# 处理逻辑elseecho "错误:文件不可写" >&2exit 1fielseecho "警告:文件内容为空" >&2fi
elseecho "错误:文件不存在" >&2exit 2
fi

嵌套优化技巧

  1. 使用逻辑运算符简化
# AND 组合条件
if [[ -f "$file" && -r "$file" ]]
thenecho "可读的常规文件"
fi# OR 组合条件
if [ "$status" -eq 0 ] || [ "$force" = "true" ]
then执行操作
fi
  1. Case语句替代深层嵌套
case "$OS_TYPE" in"Linux")case "$DISTRO" in"Ubuntu") echo "APT包管理" ;;"CentOS") echo "YUM包管理" ;;esac ;;"Darwin") echo "Homebrew" ;;
esac

常见错误处理

  • 错误:未闭合的fi
# 错误示例
if [ cond1 ]; thenif [ cond2 ]; then...
# 缺少两个fi# 正确写法
if [ cond1 ]; thenif [ cond2 ]; then...fi
fi
  • 错误:条件格式错误
# 错误:缺少空格
if [$var -eq 0]# 正确
if [ $var -eq 0 ]

调试建议
使用-x参数跟踪执行:

bash -x script.sh
# 显示实际执行的嵌套逻辑

标题Q6shell脚本中“$?”标记的用途是什么?

$? 是Shell脚本中的 退出状态码捕获变量,其核心作用与使用场景如下:

1. 基本功能
存储最近执行命令的退出状态码(exit code)

  • 0 → 命令执行成功
  • 1-255 → 执行失败(具体含义由程序定义)

2. 典型使用场景

# 示例1:直接检查
ls /invalid/path
if [ $? -ne 0 ]; thenecho "错误代码: $? → 路径不存在"
fi# 示例2:保存状态码
tar -czf backup.tgz /data
backup_status=$?
[ $backup_status -eq 0 ] && echo "备份成功" || echo "备份失败"# 示例3:错误分级处理
curl -s http://example.com
case $? in0) echo "请求成功" ;;6) echo "DNS解析失败" ;;7) echo "连接拒绝" ;;*) echo "未知错误: $?" ;;
esac

3. 特殊场景注意事项

  • 管道命令 只捕获最后一条命令的状态
grep 'error' log.txt | wc -l
echo $?  # 显示的是wc命令的退出码
  • 复合命令 的状态捕获
(command1 && command2) || command3
echo $?  # 显示整个逻辑链的最终状态

4. 常用状态码对照表

状态码典型含义
0成功
1一般错误
2错误使用shell命令
126命令不可执行
127命令未找到
130通过Ctrl+C终止
143通过SIGTERM终止

5. 自定义退出码
在脚本中通过exit命令设置:

#!/bin/bash
if [ ! -f config.ini ]; thenecho "配置文件缺失" >&2exit 25  # 自定义错误码
fi

调试技巧
实时跟踪状态码变化:

set -x  # 启用调试模式
your_command
echo "状态码: $?"
set +x  # 关闭调试

标题Q7在shell脚本中如何比较两个数字 ?

在Shell脚本中进行数字比较时,需根据具体场景选择合适的比较方式:

1. 基础整数比较(推荐使用双括号)

a=15
b=20# 最佳实践方式
if (( a < b )); thenecho "$a 小于 $b"
elif (( a == b )); thenecho "数值相等"
elseecho "$a 大于 $b"
fi

2. 带类型检查的安全比较

#!/bin/bash
read -p "输入第一个数字: " num1
read -p "输入第二个数字: " num2# 验证输入有效性
if ! [[ "$num1" =~ ^[0-9]+$ ]] || ! [[ "$num2" =~ ^[0-9]+$ ]]; thenecho "错误:必须输入整数" >&2exit 1
fi# 执行比较
if [ "$num1" -gt "$num2" ]; thenecho "$num1 大于 $num2"
elif [ "$num1" -lt "$num2" ]; thenecho "$num1 小于 $num2"
elseecho "两个数字相等"
fi

3. 浮点数比较解决方案

# 使用awk进行精确比较
float1=3.1415
float2=2.71828if awk -v n1="$float1" -v n2="$float2" 'BEGIN {exit (n1 > n2)}'; thenecho "$float1 大于 $float2"
elseecho "$float2 大于或等于 $float1"
fi

4. 多数字排序实践

# 三个数字排序示例
x=5
y=3
z=7if (( x > y )); thentemp=$xx=$yy=$temp
fiif (( y > z )); thentemp=$yy=$zz=$temp
fiif (( x > y )); thentemp=$xx=$yy=$temp
fiecho "排序结果: $x $y $z"

5. 性能对比测试

# 测试不同比较方式的效率
time for i in {1..10000}; do[ $i -gt 5000 ] > /dev/null
donetime for i in {1..10000}; do(( i > 5000 )) > /dev/null
done

注意事项总结

  1. 使用-eq-ne等test运算符时,确保变量值为整数
  2. 双括号(( ))结构支持更丰富的算术运算
  3. 处理用户输入时务必进行类型验证
  4. 浮点比较推荐使用bcawk工具
  5. 在循环体内尽量使用算术扩展方式提升性能

标题shell脚本中break命令的作用 ?

在Shell脚本中,break命令用于提前终止循环(如forwhileuntil),直接跳出当前循环体,继续执行循环之后的代码。


核心作用

  1. 单层循环跳出

    # 示例:找到数字3时立即终止循环
    for i in {1..5}; doif [[ $i -eq 3 ]]; thenbreak  # 跳出循环fiecho "当前值: $i"
    done
    

    输出:

    当前值: 1
    当前值: 2
    
  2. 多层循环跳出
    通过break n指定跳出n层循环(默认n=1):

    # 示例:跳出两层循环
    for i in {1..3}; dowhile true; doecho "i=$i, 内层循环"break 2  # 直接跳出外层for循环done
    done
    

    输出:

    i=1, 内层循环
    

对比continue

  • break完全终止循环,后续迭代不再执行。
  • continue跳过当前迭代,直接进入下一次循环。

典型场景

  • 满足条件时提前终止循环(如搜索到目标后停止)。
  • 避免因异常逻辑导致无限循环。

总结break是控制循环流程的关键命令,合理使用可提升脚本执行效率。

标题Q9shell脚本中continue命令的作用 ?

在Shell脚本中,continue命令用于跳过当前循环迭代的剩余代码,直接进入下一次循环(forwhileuntil),而非终止整个循环。


核心作用

  1. 单层循环跳过

    # 示例:跳过偶数的输出
    for i in {1..5}; doif [[ $i%2 -eq 0 ]]; thencontinue  # 跳过本次循环fiecho "奇数: $i"
    done
    

    输出:

    奇数: 1
    奇数: 3
    奇数: 5
    
  2. 多层循环跳过
    通过continue n指定跳过n层循环的当前迭代(默认n=1):

    # 示例:外层循环i=2时,跳过内层循环
    for i in {1..3}; doecho "外层i=$i"for j in {A..C}; doif [[ $i -eq 2 ]]; thencontinue 2  # 跳过外层循环的当前迭代fiecho "内层j=$j"done
    done
    

    输出:

    外层i=1
    内层j=A
    内层j=B
    内层j=C
    外层i=2
    外层i=3
    内层j=A
    内层j=B
    内层j=C
    

对比break

  • continue:仅跳过当前迭代,继续下一次循环。
  • break完全终止循环,后续迭代不再执行。

典型场景

  • 过滤特定条件的数据(如忽略空文件、排除某些文件名)。
  • 优化循环效率,避免执行不必要的操作。

总结continue是精细化控制循环流程的工具,特别适合需要条件性跳过的场景。

Q10告诉我shell脚本中Case语句的语法 ?

在Shell脚本中,case语句用于实现多条件分支判断,语法结构如下:

case 变量 in模式1)对应模式1的命令;;模式2|模式3)  # 多个模式用|分隔对应模式2/3的命令;;*)  # 默认匹配(类似else)默认命令;;
esac

关键语法说明

  1. 模式匹配

    • 支持通配符:*(任意字符)、?(单个字符)、[0-9](字符范围)
    • 支持逻辑或:模式A|模式B
    • 示例:
      case $input in[Yy]|Yes) echo "确认操作" ;;[Nn]o?)   echo "取消操作" ;;*)        echo "无效输入" ;;
      esac
      
  2. 执行规则

    • 从上到下匹配,首个匹配的模式会触发对应命令
    • ;; 表示结束当前模式块(类似break
    • ;&(Bash 4.0+)可继续执行下一个模式的命令(类似fallthrough

实际应用示例

#!/bin/bash
echo "选择操作:"
read -p "1.启动 2.停止 3.重启: " optcase $opt in1|启动)systemctl start service;;2|停止)systemctl stop service;;3|重启)systemctl restart service;;*)echo "错误:无效选项"exit 1;;
esac

对比if-elif

  • case更适合模式匹配场景(如字符串、通配符)
  • if-elif更适合复杂条件判断(如数值比较、逻辑运算)

Q11shell脚本中while循环语法 ?

在Shell脚本中,while循环用于重复执行命令块,直到条件变为假。其基本语法如下:

while [ 条件判断 ]
do# 循环体(要重复执行的命令)
done

语法详解

  1. 条件判断

    • 支持所有Shell条件表达式(如数值比较、字符串判断、文件测试等)
    • 示例:
      # 数值比较
      while [[ $i -lt 5 ]]# 文件存在性检查
      while [ -f "/tmp/lockfile" ]# 命令返回值判断
      while grep -q "error" log.txt
      
  2. 无限循环

    while true  # 或 while :
    doecho "持续运行..."sleep 1
    done
    
  3. 从文件/输入流读取数据

    while read line
    doecho "行内容: $line"
    done < input.txt
    

典型示例

  1. 计数器循环

    #!/bin/bash
    i=0
    while [ $i -lt 3 ]
    doecho "当前计数: $i"((i++))  # 等同于 i=$((i+1))
    done
    

    输出:

    当前计数: 0
    当前计数: 1
    当前计数: 2
    
  2. 条件动态变化

    # 监控进程是否存在
    while ps -p 1234 > /dev/null
    doecho "进程1234仍在运行"sleep 5
    done
    

流程控制

  • break:立即终止循环
  • continue:跳过当前迭代,进入下一次循环

对比until循环

  • while:条件为时执行
  • until:条件为时执行(until [ 条件 ]; do ... done

总结while循环是自动化重复任务的核心工具,特别适合处理动态条件或流式数据。

Q12如何使脚本可执行 ?

要让Shell脚本可执行,需要通过chmod命令添加执行权限。具体步骤如下:

  1. 添加执行权限

    chmod +x script.sh
    

    或指定具体权限:

    chmod 755 script.sh  # 用户:rwx,组和其他:rx
    
  2. 执行脚本

    • 直接运行(需指定路径):
      ./script.sh
      
    • 全局调用(将脚本放入PATH环境变量目录):
      sudo mv script.sh /usr/local/bin/
      script.sh  # 任意位置直接执行
      

原理说明

  • Linux文件系统中,执行权限(x)是运行脚本的必要条件。
  • #!/bin/bash(Shebang行)指定解释器,确保脚本被正确解析。

验证权限

ls -l script.sh

输出示例:

-rwxr-xr-x 1 user group 0 Jan 1 00:00 script.sh

x表示已获得执行权限)

标题Q13“#!/bin/bash”的作用 ?

#!/bin/bash 称为 Shebang(或 Hashbang),其核心作用是指定脚本的解释器路径,确保脚本使用正确的程序执行。以下是详细说明:


核心功能

  1. 解释器声明

    • 告诉系统使用/bin/bash作为解释器执行脚本内容
    • 若未指定,默认使用当前用户的默认Shell(可能是shzsh等)
  2. 跨环境一致性

    • 避免因不同Shell的语法差异导致脚本执行错误
    • 示例:bash支持数组,而sh不支持

使用规范

  • 必须为文件首行(前两字符#!不可有空格或空行)
  • 路径可调整(根据实际解释器位置):
    #!/usr/bin/env bash  # 推荐:通过环境变量查找bash,增强兼容性
    

对比实验

  1. 无Shebang的脚本

    echo "Hello World"
    
    • 执行方式:bash script.sh(必须显式指定解释器)
  2. 有Shebang的脚本

    #!/bin/bash
    echo "Hello World"
    
    • 执行方式:./script.sh(直接运行)

常见Shebang示例

解释器Shebang行
Python 3#!/usr/bin/python3
Perl#!/usr/bin/perl
Shell(系统默认)#!/bin/sh

验证方法

# 查看当前脚本使用的解释器
ps -p $$ -o comm=
# 输出:bash(若Shebang生效)

总结:Shebang是Shell脚本的“身份证”,明确解释器路径能确保脚本行为可预期。

Q14shell脚本中for循环语法 ?

Shell脚本中常见的for循环语法有以下几种形式:

  1. 基础列表循环
for var in item1 item2 item3
do# 循环体echo $var
done

示例:for i in apple banana cherry; do echo $i; done

  1. 通配符扩展循环
for file in *.txt
doecho "Processing file: $file"
done
  1. C语言风格循环(bash特有)
for ((i=0; i<10; i++))
doecho "Count: $i"
done
  1. 数组遍历
arr=("one" "two" "three")
for item in "${arr[@]}"
doecho $item
done
  1. 数字范围循环(bash 4.0+)
for i in {1..5}
doecho $i
done
  1. 命令输出循环
for user in $(cut -d: -f1 /etc/passwd)
doecho "User: $user"
done

注意:

  • 使用$var时建议加上引号:"$var"
  • 修改IFS可以改变字段分隔方式
  • 不同shell(bash/zsh/sh)可能有细微差异
  • 处理文件名时建议使用for file in *.txt; do ...而不是解析ls输出

Q15如何调试shell脚本 ?

Shell脚本调试常用方法如下:

  1. 基础调试选项
# 执行时启用调试
bash -x script.sh        # 显示执行过程
bash -v script.sh        # 显示原始命令
bash -n script.sh        # 只检查语法不执行# 脚本内启用调试
#!/bin/bash -x           # 直接在shebang启用
set -x                   # 开启调试模式
set +x                   # 关闭调试模式
  1. 组合调试模式
#!/bin/bash -ex          # 同时启用 -e(出错退出)和 -x(调试)
# 或脚本内设置
set -euxo pipefail       # 常用严格模式组合:# -e 遇到错误立即退出# -u 未定义变量报错# -x 打印执行命令# -o pipefail 管道错误捕获
  1. 分段调试
( set -x; 要调试的代码块; set +x )
  1. 输出调试
echo "DEBUG: 当前变量值=$var" >&2   # 输出到标准错误
printf "Processing file: %s\n" $file
  1. trap调试
trap 'echo "Line $LINENO: var=$var"' DEBUG  # 每行执行前触发
trap 'echo "Exit with code $?"' EXIT       # 退出时触发
  1. 日志记录
exec 3>&1 4>&2          # 保存原始输出
exec 1>script.log       # 重定向标准输出
exec 2>&1               # 合并错误输出到日志
  1. 调试工具
bashdb script.sh        # 使用bash调试器# 支持断点/单步执行/变量检查

调试技巧:

  • 使用PS4='+ $LINENO: ' 显示行号
  • 临时注释代码块使用:<<'COMMENT' ... COMMENT
  • 检查隐藏字符:cat -A script.sh
  • 测试条件判断:[[ ]]替换[ ]获得更好调试信息

示例调试流程:

#!/bin/bash -ex
# 严格模式运行trap 'echo "Error at line $LINENO"' ERRfor file in *.txt
doecho "Processing: $file"wc -l "$file"
done

Q16shell脚本如何比较字符串?

在 Shell 脚本中,比较字符串主要使用 test 命令(即 [ ... ])或 [[ ... ]],以下是常用的字符串比较方法:

1. 使用 [ ... ] 进行字符串比较

[ ... ] 是基本的测试命令,适用于 POSIX 标准的 Shell(如 sh)。

  • 相等=
    if [ "$str1" = "$str2" ]; thenecho "字符串相等"
    fi
    
  • 不相等!=
    if [ "$str1" != "$str2" ]; thenecho "字符串不相等"
    fi
    
  • 空字符串-z
    if [ -z "$str" ]; thenecho "字符串为空"
    fi
    
  • 非空字符串-n
    if [ -n "$str" ]; thenecho "字符串不为空"
    fi
    

注意

  • 始终将变量用双引号 "" 括起来(如 "$str1"),以避免变量未定义或为空时的语法错误。
  • [ ... ] 中必须在 [] 两侧各留一个空格。

2. 使用 [[ ... ]] 进行字符串比较

[[ ... ]] 是 Bash/Ksh/Zsh 的扩展测试命令,功能更强大,推荐在 Bash 脚本中使用。

  • 相等=, ==
    if [[ "$str1" == "$str2" ]]; thenecho "字符串相等"
    fi
    
  • 不相等!=
    if [[ "$str1" != "$str2" ]]; thenecho "字符串不相等"
    fi
    
  • 空字符串-z
    if [[ -z "$str" ]]; thenecho "字符串为空"
    fi
    
  • 非空字符串-n
    if [[ -n "$str" ]]; thenecho "字符串不为空"
    fi
    
  • 模式匹配=~(正则表达式)
    if [[ "$str" =~ ^[0-9]+$ ]]; thenecho "字符串是数字"
    fi
    
  • 字典序比较
    • 小于:<
    • 大于:>
    if [[ "$str1" < "$str2" ]]; thenecho "$str1 小于 $str2(字典序)"
    fi
    

注意

  • [[ ... ]] 不需要像 [ ... ] 那样严格处理变量引用,变量未定义时更安全。
  • 字典序比较(<>)只在 [[ ... ]] 中有效,且基于 ASCII 顺序。

3. 常见问题与注意事项

  • 大小写敏感:默认情况下,字符串比较是大小写敏感的。如果需要忽略大小写,可以在比较前将字符串转换为同一大小写:

    if [[ "${str1,,}" == "${str2,,}" ]]; thenecho "字符串相等(忽略大小写)"
    fi
    

    这里的 ${str,,} 是 Bash 的参数扩展,将字符串转换为小写。

  • 空格敏感:字符串比较会考虑空格,确保比较前处理好字符串(如使用 trim)。

    str1=" hello "
    str2="hello"
    if [[ "${str1// /}" == "${str2// /}" ]]; thenecho "字符串相等(忽略空格)"
    fi
    
  • 性能:对于简单比较,[ ... ][[ ... ]] 性能差异不大,但 [[ ... ]] 更适合复杂场景(如正则匹配)。

4. 示例脚本

以下是一个综合示例,展示字符串比较的几种用法:

#!/bin/bashstr1="hello"
str2="HELLO"# 相等比较
if [[ "$str1" == "$str2" ]]; thenecho "字符串相等"
elseecho "字符串不相等"
fi# 忽略大小写比较
if [[ "${str1,,}" == "${str2,,}" ]]; thenecho "字符串相等(忽略大小写)"
fi# 检查是否为空
if [[ -z "$str1" ]]; thenecho "str1 为空"
elseecho "str1 不为空"
fi# 正则匹配
if [[ "$str1" =~ ^h.*o$ ]]; thenecho "str1 以 h 开头,o 结尾"
fi

5. 总结

  • 简单脚本或 POSIX 兼容性要求高时,使用 [ ... ]
  • 复杂脚本或需要正则、字典序比较时,使用 [[ ... ]]
  • 始终用双引号包裹变量,确保脚本健壮性。
  • 根据需要处理大小写、空格等特殊情况。
http://www.xdnf.cn/news/465031.html

相关文章:

  • 基于SpringBoot的家政服务系统设计与实现(源码+文档+部署讲解)
  • 20、鸿蒙学习——OAID、AAID、ODID
  • openEuler24.03 LTS下安装MySQL8.0.42
  • 气动排渣煤粉炉专用V型球阀——法兰连接耐磨阀门生产厂家解析-耀圣
  • 详解 Zephyr RTOS:架构、功能与开发指南
  • Function Calling
  • 106. 从中序与后序遍历序列构造二叉树
  • 【206】VS2022 C++ 实现无符号32位整数和IP地址字符串互相转换
  • element-ui的el-cascader增加全选按钮实现(附源码)
  • DB-GPT扩展自定义app配置说明
  • 【网络编程】九、详解 HTTPS 加密原理
  • 鸿蒙 ArkUI - ArkTS 组件 官方 UI组件 合集
  • AEO认证的好处 ,如何快速获取AEO认证?
  • Java应用OOM排查:面试通关“三部曲”心法
  • android display 笔记(十四)VAU 和GSP 分别代表什么
  • fpga系列 HDL : Microchip FPGA开发软件 Libero Soc 安装 license申请
  • 企业级Javaweb开发常用注解
  • macOS中5000端口被控制中心占用问题
  • 洛谷P4907题解
  • Milvus(23):过滤
  • 《Python星球日记》 第81天:回看图像生成与风格迁移
  • Python机器学习笔记(二十三 模型评估与改进-网格搜索)
  • AcroForm 文档(打开时)级脚本对比 Excel VBA 参考
  • 关于多线程的Redis模型
  • 数据科学和机器学习的“看家兵器”——pandas模块 之二
  • c++从入门到精通(四)--动态内存,模板与泛型编程
  • python克洛伊婚纱摄影预约管理系统
  • P2679 [NOIP 2015 提高组] 子串
  • Linux之Yum源与Nginx服务篇
  • Node.js 安装 + React Flow 快速入门:环境安装与项目搭建