目录
一、表达式与运算符
1.表达式
算术表达式
- bash自身并不支持简单的数学运算,但可通过awk 和expr等命令来实现数学运算。
- expr最为常用,使用它能够完成表达式的求值操作。
expr 5 + 3 操作数与运算符之间一定要有空格
- 更为简单的方式是使用$[]表达式进行数学计算。
val=$[5+3] 操作数与运算符之间不能有空格
- $(( )) 也是常用的方式
val=$((5+3)) 操作数与运算符之间不能有空格
#!/bin/bash
result_expr=$(expr 5 + 3)
echo "使用 expr 计算 5 + 3 = $result_expr"
result_brackets=$[5+3]
echo "使用 \$[] 计算 5 + 3 = $result_brackets"
result_double=$((5+3))
echo "使用 \$(( )) 计算 5 + 3 = $result_double"
逻辑表达式
- 逻辑表达式主要用于条件判断,值为true(或0)表示结果为真;值为false(非零值)表示结果为假。
- 通常使用test命令来判断表达式的真假。
test 逻辑表达式
#!/bin/bash
test 5 -gt 3
echo $? # 输出 0,表示为真
test 3 -gt 5
echo $? # 输出 1,表示为假
逻辑表达式
- Linux每个版本中都包含test命令,但该命令有一个更常用的别名,即左方括号“[”。
[ 逻辑表达式 ]
- 当使用左方括号而非test时,其后必须始终跟着一个空格、要评估的逻辑表达式、一个空格和右方括号,右方括号表示所需评估表达式的结束。逻辑表达式两边的空格是必需的。
#!/bin/bash
[ 5 -gt 3 ]
echo $? # 输出 0,表示为真
[ 3 -gt 5 ]
echo $? # 输出 1,表示为假
2.运算符
算术运算符
- +:加法
- -:减法
- *:乘法
- /:除法
- %:取余
- =:赋值
#!/bin/bash
val1=10
val2=3
result_add=$((val1 + val2))
echo "加法:$val1 + $val2 = $result_add"
result_sub=$((val1 - val2))
echo "减法:$val1 - $val2 = $result_sub"
result_mul=$((val1 * val2))
echo "乘法:$val1 * $val2 = $result_mul"
result_div=$((val1 / val2))
echo "除法:$val1 / $val2 = $result_div"
result_mod=$((val1 % val2))
echo "取余:$val1 % $val2 = $result_mod"
整数关系运算符
#!/bin/bash
a=5
b=3
if [ $a -eq $b ]; then
echo "$a 等于 $b" else
echo "$a 不等于 $b"
fi
............. ..............
if [ $a -ge $b ]; then
echo "$a 大于或等于 $b" else
echo "$a 小于 $b"
fi
if [ $a -le $b ]; then
echo "$a 小于或等于 $b" else
echo "$a 大于 $b"
fi
字符串检测运算符
文件测试运算符
布尔运算符
假设a=8 b=20
二、流程控制语句
1.多命令组合
- 使用逻辑与符号“&&”连接多条命令
命令1 && 命令2
- 使用逻辑或符号“||”连接多条命令
命令1 || 命令2
- 联合使用符号“&&”和“||”
命令1 && 命令2 || 命令3
命令1 || 命令2 && 命令3
- 使用括号()组合多条命令
(命令1 && 命令2) || 命令3
示例:
# 创建一个目录,进入目录,如果成功则列出文件,否则输出错误信息
mkdir my_directory && (
cd my_directory && ls || echo "目录为空或无法列出文件"
) || echo "创建目录失败"
2.分支结构
基本if语句
if [ 条件 ]; then
# 条件为真时执行的命令
fi
#!/bin/bash
number=10
if [ $number -gt 5 ]; then
echo "数字大于5"
fi
if...else 语句
if [ 条件 ]; then
# 条件为真时执行的命令
else
# 条件为假时执行的命令
fi
#!/bin/bash
number=3
if [ $number -gt 0 ]; then
echo "数字是正数" else
echo "数字不是正数"
fi
if...elif...else 语句
if [ 条件1 ]; then
# 条件1为真时执行的命令
elif [ 条件2 ]; then
# 条件2为真时执行的命令
else
# 条件1和条件2都不满足时执行的命令
fi
#!/bin/bash
number=-1
if [ $number -gt 0 ]; then
echo "数字是正数"
elif [ $number -eq 0 ]; then
echo "数字是零"
else
echo "数字是负数"
fi
使用 ! 进行非运算
if [ ! 条件 ]; then
# 条件为假时执行的命令
fi
使用方括号 [[ ]] 在bash执行下才有效
if [[ 条件 ]]; then
# 条件为真时执行的命令
fi
case语句
case 值 in
模式1)
语句序列1
;;
模式2)
语句序列2
;;
…… 模式n)
语句序列n ;;
*)
其他语句序列
esac
循环语句
while循环语句
while 测试条件
do
语句序列
done
#!/bin/bash
count=1
# 当计数器小于等于5时循环
while [ $count -le 5 ]
do
echo "计数: $count"
count=$((count + 1)) # 增加计数器
done
until循环语句的用法和while循环语句的用法相同。
for循环语句
for 变量 [in 列表]
do
语句序列
done
#!/bin/bash
fruits=("苹果" "香蕉" "橙子")
for fruit in "${fruits[@]}"
do
echo "水果: $fruit"
done
其他循环语句
- break语句用来终止一个重复执行的循环
- break [n]
- continue语句跳过当前循环体中位于它后面的语句,直接进入下一次循环
- continue [n]
- exit语句用来退出一个Shell程序并设置退出值 n 是退出状态码,默认为 0(表示成功)。
- exit [n]
三、函数
1.定义与调用
函数定义
- Shell 函数必须先定义后使用。
[function] 函数名()
{
命令序列
[return 返回值]
}
函数调用
- 调用函数只需要给出函数名,不需要加括号,就像一般命令那样使用。
函数名 参数1 参数2 …… 参数n
2.参数
- 在Shell中调用函数时可以向其传递参数。
- 与脚本一样,在函数体内部也是通过$n的形式来获取参数的值。
- $1表示第一个参数。
- $2表示第二个参数。
3.定义与调用
4.返回值
使用全局变量
- 先定义一个变量,用来接收函数的计算结果,脚本在需要的时候访问这个变量来获得函数的返回值。
- 使用变量要注意不要修改父脚本里不期望被修改的内容。
#!/bin/bash
result=0
getsum() {
result=$(( $1 + $2 )) # 修改全局变量
}
getsum 5 10
echo "和是: $result"
在函数中使用标准输出
将一个Shell函数作为一个子程序调用(命令替换),将返回值写到子程序的标准输出。
#!/bin/bash
getdatetime() {
echo "当前日期和时间: $(date)"
}
current_time=$(getdatetime)
echo "$current_time"
可重用性:通过将结果存储在变量中,可以在脚本的多个地方引用这个值,而不需要多次调用函数。
避免冗余:如果只需要使用函数的输出而不想立即打印,命令替换可以避免不必要的输出。
在函数中使用return返回整数值
- $?是一个特殊的内部变量,可用于获取上一个命令执行后的返回结果,可以直接通过函数return语句来接收返回值。
#!/bin/bash
calculate_sum() {
local sum=$(( $1 + $2 ))
return $sum
}
calculate_sum 5 10
result=$? # 获取上一个命令的返回值
echo "5 + 10 = $result"
总结
Linux Shell编程是一种灵活的脚本语言,它通过表达式和运算符来执行计算和字符串操作,其中表达式可以是简单的变量或复杂的函数调用,而运算符则定义了这些表达式如何被计算。流程控制语句是Shell编程的核心,它们允许通过多命令组合和分支结构来控制脚本的执行流程,使得任务自动化和条件执行成为可能。函数在Shell编程中扮演着重要角色,它们可以被定义和调用,接受参数,并返回值,从而提高代码的模块化和重用性。掌握这些基本概念对于编写高效、可维护的Shell脚本至关重要。
标签:语句,shell,echo,运算符,命令,result,Linux,bash,初学者 From: https://blog.csdn.net/Ccwlwlbb51522/article/details/144532825