Skip to main content

2.变量和运算

变量

简介

  • 变量是用来存储数据值的容器,变量可以存储各种类型的数据,包括文本字符串、数字、文件名等。

示例:

name="John"	
age=25
path_to_file="/home/user/documents/example.txt"

变量的常见类型

  • 自定义变量
    • 作用范围仅在当前 shell 中有效
    • 不允许数字命名, 不能使⽤“-”命名
  • 系统环境变量
  • 位置参数变量
  • 预先定义变量

自定义变量量

定义变量

变量名=变量值

引⽤用变量

$变量名 或 ${变量名}

查看变量

echo $变量名 

set显示所有变量 #包括⾃自定义变量和环境变量

取消变量

unset 变量量名 

系统环境变量

3.查看变量量 echo $变量量名 set显示所有变量量,包括⾃自定义变量量和环境变量量 4.取消变量量 unset 变量量名 作⽤用范围:仅在当前 shell 中有效

定义环境变量量

本地变量(Local Variables)

  • 本地变量在脚本中定义,并且只在脚本的特定部分或函数中有效。
  • 不能被其他脚本或函数访问。
function example_function {
local local_var="This is a local variable."
echo $local_var
}

全局变量(Global Variables)

  • 在整个Shell会话中都可见的变量。
  • 全局变量通常在脚本的最外层定义,可以被脚本中的任何地方访问。
global_var="This is a global variable."

环境变量(Environment Variables)

  • 环境变量是在Shell启动时设置的,对所有子进程和脚本可见。
  • 通常以大写字母命名。
export PATH="/usr/bin:/bin:/usr/local/bin"

位置参数(Positional Parameters)

  • 位置参数是脚本或函数中传递的参数,以 $1$2 等形式引用。
  • 它们表示传递给脚本或函数的参数值。
echo "First argument: $1"

特殊参数

  • $0
    • 表示脚本或命令本身的名称。
    • 在脚本中,这通常用于获取脚本的名称。
  • $?
    • 表示上一个命令的退出状态。
    • 通常,0 表示成功,而其他非零值表示出现错误。
  • $!
    • 表示后台运行的最后一个作业(进程)的PID(进程ID)。
  • $$
    • 表示当前Shell脚本或命令的进程ID。
  • $*
    • 表示所有的位置参数,以一个单字符串显示,用空格分隔。
    • 例如,"$*" 等价于 "$1 $2 $3 ..."
  • $#
    • 表示传递给脚本或函数的参数个数。
  • $@
    • 表示所有的位置参数,以一个字符串显示,每个参数用引号括起来,以保留参数中的空白字符。
    • 例如,"$@" 用于传递所有参数给其他命令。

示例:

#!/bin/bash

echo "Script Name: $0"
echo "Number of arguments: $#"
echo "All arguments as a single string: $*"
echo "All arguments as separate strings: $@"
echo "Exit status of the last command: $?"
echo "Process ID of the current script: $$"

# Run a command in the background
sleep 5 &
echo "PID of the last background command: $!"

# Example function with arguments
function example_function {
echo "Function Name: $FUNCNAME"
echo "Number of arguments within the function: $#"
echo "All arguments within the function as a single string: $*"
}

# Call the function with arguments
example_function arg1 arg2 arg3

数组(Arrays):

  • 数组用于存储一系列值,可以是数字、字符串等。
  • Shell默认将所有变量视为字符串。
  • 数组的索引通常从0开始。
my_array=("value1" "value2" "value3")

定义变量

通常使用等号 来进行赋值

variable_name=value
  • 变量的命名是区分大小写的,并且通常使用大写字母来表示。
  • 给变量赋值时,等号两侧不能有空格。
# 定义字符串变量
name="John"

# 定义整数变量
age=25

# 定义浮点数变量
temperature=98.6

# 定义数组变量
my_array=("value1" "value2" "value3")

# 定义命令输出作为变量值
current_date=$(date)

使用变量

引用变量

在变量名前加上 $符号来引用它。

name="zhangsang"
age=25
echo "My name is $name and I am $age years old."

修改变量值

# 重新赋值
age=30

# 在原有值基础上进行修改
age=$((age + 1)) #运算操作需要双括号

删除变量

unset age

字符串连接

greeting="Hello"
name="World"
full_message="$greeting, $name!"
echo $full_message

位置参数

位置参数表示传递给脚本或函数的参数值,使用 $1$2 等表示:

#!/bin/bash

echo "Script Name: $0"
echo "First Argument: $1"
echo "Second Argument: $2"

数组

# 定义数组
my_array=("value1" "value2" "value3")

# 访问数组元素
echo "First element: ${my_array[0]}" #索引从0开始

特殊变量

echo "Script Name: $0"
echo "Process ID: $$"

环境变量

# 定义环境变量
export MY_VARIABLE="some_value"

# 引用环境变量
echo "Variable Value: $MY_VARIABLE"

变量运算

运算方法

变量运算有3种方法

使用 expr 命令

expr 是一个用于执行表达式计算的命令,可以用于简单的加法、减法、乘法等运算。

# 示例:加法
result=$(expr $a + $b)

# 示例:减法
result=$(expr $a - $b)

使用 let 命令

let 命令是 Shell 内建命令,用于执行算术运算。

# 示例:加法
let "result = a + b"

# 示例:减法
let "result = a - b"

使用双括号 ((...))

双括号 ((...)) 是 Shell 的一种扩展语法,可以用于执行算术运算。

# 示例:加法
result=$((a + b))

# 示例:减法
result=$((a - b))

使用 bc 命令(适用于浮点数运算)

bc 是一个用于执行任意精度的浮点数运算的命令。

# 示例:浮点数加法
result=$(echo "$a + $b" | bc)

# 示例:浮点数减法
result=$(echo "$a - $b" | bc)

使用 $((...))(适用于整数运算)

$((...)) 是 Shell 的一种内建算术扩展,适用于整数运算。

# 示例:加法
result=$((a + b))

# 示例:减法
result=$((a - b))

注意:

  • 在进行算术运算时,确保变量的值不包含非数字字符,否则可能导致错误。
  • 使用这些方法时,也需要考虑 Shell 的限制,例如在某些情况下可能无法处理大数或浮点数。

变量索引

在 Shell 编程中,变量索引通常用于访问数组的元素。Shell 中的数组是一种特殊的变量,可以包含多个值。

数组索引

在 Shell 中,数组的索引从 0 开始。可以使用变量和中括号来访问数组的元素。

# 定义数组
my_array=("value1" "value2" "value3")

# 访问数组元素
echo ${my_array[0]} # 输出 value1
echo ${my_array[1]} # 输出 value2

使用变量作为索引

可以使用变量作为数组的索引。

index=1
echo ${my_array[$index]} # 输出 value2

数组长度

要获取数组的长度,可以使用 # 符号。

length=${#my_array[@]}
echo "Array length: $length"

关联数组

在 Bash 4.0 版本及更高版本中,支持关联数组,即可以使用字符串作为索引。

# 定义关联数组
declare -A assoc_array
assoc_array["key1"]="value1"
assoc_array["key2"]="value2"

# 访问关联数组元素
echo ${assoc_array["key1"]} # 输出 value1
echo ${assoc_array["key2"]} # 输出 value2

特殊变量 @ 和 *

$@$* 用于访问所有的数组元素。

args=("arg1" "arg2" "arg3")

# 遍历数组元素
for arg in "${args[@]}"; do
echo $arg
done

字符串切片

在一般的变量中,可以使用字符串切片来获取子字符串。

my_string="Hello, World!"

# 获取子字符串
substring=${my_string:0:5} # 从索引 0 开始,长度为 5
echo $substring # 输出 Hello

i++ 和 ++i

i++:后增量(Post-increment)

i++ 表示使用变量的当前值,然后再将变量增加 1。也就是说,先取当前值,然后再执行自增操作。

i=5
result=$i++
echo "Result: $result" # 输出 Result: 5
echo "Updated i: $i" # 输出 Updated i: 6

$i++ 首先使用 i 的当前值 5,然后将 i 的值增加到 6。

++i:前增量(Pre-increment)

++i 表示先将变量增加 1,然后再使用变量的新值。也就是说,先执行自增操作,然后取新的值。

i=5
result=++i
echo "Result: $result" # 输出 Result: 6
echo "Updated i: $i" # 输出 Updated i: 6

++i 首先将 i 的值增加到 6,然后使用新的值 6。

读取键盘输入

使用 read命令来读取键盘输入

示例1:

#!/bin/bash

echo "请输入你的名字:"
read name
echo "你好,$name!"

示例2:

使用 read命令来逐字符读取键盘输入,并使用循环来遍历输出每一个字符。

#!/bin/bash

echo "请输入一串字符:"
read input_string

echo "你输入的字符是:"

# 使用循环逐字符输出
for (( i=0; i<${#input_string}; i++ )); do
echo "${input_string:i:1}"
done

https://blog.csdn.net/u011436427/article/details/103815680