例子:
shell 脚本讲 mask 转换成 CIDR 格式
#!/bin/bash# 函数: 将子网掩码转换为 CIDR mask_to_cidr() {local mask=$1local IFS=.local -a octets=($mask)local cidr=0for octet in "${octets[@]}"; do# 将八位组转换为二进制,并统计 1 的个数bin=$(echo "obase=2; $octet" | bc)ones=$(echo -n "$bin" | tr -cd '1' | wc -c)cidr=$((cidr + ones))doneecho "/$cidr" }# 示例调用 mask="255.255.255.0" cidr=$(mask_to_cidr "$mask") echo "子网掩码: $mask -> CIDR: $cidr"
在 sh
(POSIX shell)中,可以使用 awk
代替 bash
里的数组处理,以确保兼容性。以下是一个 sh
版本的脚本,它可以将子网掩码转换为 CIDR 表示法
#!/bin/sh# 函数:将子网掩码转换为 CIDR mask_to_cidr() {mask=$1echo "$mask" | awk -F. '{for (i=1; i<=4; i++) {while ($i) {cidr += $i % 2$i = int($i / 2)}}print "/" cidr}' }# 示例调用 mask="255.255.255.0" cidr=$(mask_to_cidr "$mask") echo "子网掩码: $mask -> CIDR: $cidr"
2.shell 函数 前面 需要添加 function 吗
-
Shell 脚本中定义函数时,不需要使用
function
关键字,但可以使用。 -
标准语法(
函数名()
) 是推荐的方式,兼容性更好。 -
function
语法 适合在bash
或zsh
中使用,代码更直观
3.if 中的条件判断 有哪些
在 Shell 脚本中,if
语句的条件判断非常灵活,支持多种条件表达式。以下是一些常见的条件判断类型及其用法:
1. 文件测试
用于检查文件或目录的状态。
条件 | 描述 |
---|---|
-e file |
文件是否存在 |
-f file |
是否是普通文件 |
-d file |
是否是目录 |
-r file |
文件是否可读 |
-w file |
文件是否可写 |
-x file |
文件是否可执行 |
-s file |
文件是否非空(大小大于 0) |
-L file |
文件是否是符号链接 |
file1 -nt file2 |
file1 是否比 file2 新 |
file1 -ot file2 |
file1 是否比 file2 旧 |
示例:
if [ -f "/path/to/file.txt" ]; thenecho "文件存在"
fi
2. 字符串比较
用于比较字符串。
条件 | 描述 |
---|---|
-z "$str" |
字符串是否为空 |
-n "$str" |
字符串是否非空 |
"$str1" = "$str2" |
字符串是否相等 |
"$str1" != "$str2" |
字符串是否不相等 |
"$str1" < "$str2" |
字符串 str1 是否小于 str2 |
"$str1" > "$str2" |
字符串 str1 是否大于 str2 |
示例:
if [ "$var" = "hello" ]; thenecho "变量等于 hello"
fi
3. 数值比较
用于比较数字。
条件 | 描述 |
---|---|
"$num1" -eq "$num2" |
是否相等 |
"$num1" -ne "$num2" |
是否不相等 |
"$num1" -gt "$num2" |
是否大于 |
"$num1" -ge "$num2" |
是否大于或等于 |
"$num1" -lt "$num2" |
是否小于 |
"$num1" -le "$num2" |
是否小于或等于 |
示例:
if [ "$num1" -gt 10 ]; thenecho "num1 大于 10"
fi
4. 逻辑运算符
用于组合多个条件。
条件 | 描述 |
---|---|
! condition |
非(条件取反) |
condition1 -a condition2 |
与(条件1 和 条件2 同时成立) |
condition1 -o condition2 |
或(条件1 或 条件2 成立) |
示例:
if [ "$var" = "hello" -a "$num" -gt 10 ]; thenecho "变量等于 hello 且 num 大于 10"
fi
5. 高级条件判断([[ ]]
)
[[ ]]
是 bash
中的增强版条件判断,支持更多功能。
条件 | 描述 |
---|---|
[[ "$str" =~ regex ]] |
字符串是否匹配正则表达式 |
[[ "$str1" == "$str2" ]] |
字符串是否相等(支持通配符) |
[[ "$str1" != "$str2" ]] |
字符串是否不相等 |
[[ -z "$str" ]] |
字符串是否为空 |
[[ -n "$str" ]] |
字符串是否非空 |
示例:
if [[ "$var" =~ ^[0-9]+$ ]]; thenecho "变量是纯数字"
fi
6. 命令返回值判断
if
可以直接根据命令的返回值($?
)进行判断。
条件 | 描述 |
---|---|
if command; then |
如果命令成功(返回值为 0) |
if ! command; then |
如果命令失败(返回值非 0) |
示例:
if grep "pattern" file.txt; thenecho "找到匹配内容"
fi
7. 组合条件
可以使用 &&
和 ||
组合多个条件。
条件 | 描述 | ||
---|---|---|---|
condition1 && condition2 |
条件1 和 条件2 同时成立 | ||
`condition1 | condition2` | 条件1 或 条件2 成立 |
示例:
if [ "$var" = "hello" ] && [ "$num" -gt 10 ]; thenecho "变量等于 hello 且 num 大于 10"
fi
8. 空值判断
在 Shell 中,未定义的变量或空字符串可能会导致问题,因此需要特别注意。
条件 | 描述 |
---|---|
[ -z "${var}" ] |
变量是否为空或未定义 |
[ -n "${var}" ] |
变量是否非空 |
示例:
if [ -z "${var}" ]; thenecho "变量为空或未定义"
fi
总结
Shell 脚本中的 if
条件判断非常强大,支持文件测试、字符串比较、数值比较、逻辑运算等多种操作。以下是一些关键点:
-
使用
[ ]
或[[ ]]
进行条件判断。 -
[[ ]]
是bash
的增强版,支持正则匹配和更复杂的逻辑。 -
注意变量为空或未定义的情况,使用
-z
或-n
进行判断。
希望这些内容对你有帮助!如果有其他问题,欢迎继续提问