【linux】(26)shell脚本-变量、位置变量

定义和使用变量

定义变量

在 Shell 脚本中定义变量非常简单,直接赋值即可:

sh 复制代码
#!/bin/bash
name="Alice"

注意,等号两边不能有空格。

使用变量

使用变量时需要在变量名前加上 $ 符号:

sh 复制代码
#!/bin/bash
name="Alice"
echo "Hello, $name!"

或者使用花括号:

sh 复制代码
#!/bin/bash
name="Alice"
echo "Hello, ${name}!"

变量类型

字符串变量

字符串是最常用的变量类型:

sh 复制代码
#!/bin/bash
greeting="Hello, World!"
echo $greeting

数值变量

虽然 Shell 不支持直接的数值运算,但可以使用 expr 或双括号进行算术运算:

sh 复制代码
#!/bin/bash
a=5
b=3
sum=$(expr $a + $b)
echo "Sum is $sum"

# 或者使用双括号
sum=$((a + b))
echo "Sum is $sum"

位置变量

位置变量(Positional Parameters)是 Shell 脚本中用于处理命令行参数的一种特殊变量。这些变量使得脚本可以从命令行接收输入,并根据输入执行相应的操作。

位置变量是 Shell 脚本中用来访问命令行参数的特殊变量。它们根据传递给脚本的参数位置进行编号:

  • $0:脚本的名称。
  • $1$9:传递给脚本的第 1 到第 9 个参数。
  • ${10} 及以上:传递给脚本的第 10 个及以上的参数。
  • $#:传递给脚本的参数个数。
  • $@:传递给脚本的所有参数(每个参数独立引用)。
  • $*:传递给脚本的所有参数(作为一个单词引用)。
  • $$:当前 Shell 进程的进程 ID。
  • $?:上一个命令的退出状态。
  • $!:最后一个后台进程的进程 ID

使用位置变量

基本示例

编写一个简单的脚本来演示位置变量的使用:

sh 复制代码
#!/bin/bash

echo "Script name: $0"
echo "First parameter: $1"
echo "Second parameter: $2"
echo "Number of parameters: $#"
echo "All parameters (individually quoted): $@"
echo "All parameters (single quoted): $*"

保存为 positional.sh 并赋予执行权限:

sh 复制代码
chmod +x positional.sh

运行脚本并传递参数:

sh 复制代码
./positional.sh arg1 arg2 arg3

输出:

复制代码
Script name: ./positional.sh
First parameter: arg1
Second parameter: arg2
Number of parameters: 3
All parameters (individually quoted): arg1 arg2 arg3
All parameters (single quoted): arg1 arg2 arg3

访问超过 9 个参数

如果传递的参数超过 9 个,可以使用大括号进行引用:

sh 复制代码
#!/bin/bash

echo "Tenth parameter: ${10}"

特殊变量

  • $#:传递给脚本的参数个数。
  • $@$* 的区别:
    • $@:每个参数作为独立的引用。
    • $*:所有参数作为一个单独的字符串。
$# 示例
sh 复制代码
#!/bin/bash

echo "Number of parameters: $#"
$@$* 示例

编写脚本 params.sh

sh 复制代码
#!/bin/bash

echo "\$@ example:"
for param in "$@"; do
    echo "$param"
done

echo "\$* example:"
for param in "$*"; do
    echo "$param"
done

运行脚本:

sh 复制代码
./params.sh "arg1" "arg2" "arg3"

输出:

复制代码
$@ example:
arg1
arg2
arg3
$* example:
arg1 arg2 arg3

使用位置参数进行计算和操作

求和脚本

编写一个求和脚本:

sh 复制代码
#!/bin/bash

sum=0
for arg in "$@"; do
    sum=$((sum + arg))
done

echo "Sum of parameters: $sum"

保存为 sum.sh 并赋予执行权限:

sh 复制代码
chmod +x sum.sh

运行脚本:

sh 复制代码
./sum.sh 1 2 3 4 5

输出:

复制代码
Sum of parameters: 15

字符串拼接脚本

编写一个字符串拼接脚本:

sh 复制代码
#!/bin/bash

result=""
for arg in "$@"; do
    result="$result$arg "
done

echo "Concatenated string: $result"

保存为 concat.sh 并赋予执行权限:

sh 复制代码
chmod +x concat.sh

运行脚本:

sh 复制代码
./concat.sh Hello World from Shell

输出:

复制代码
Concatenated string: Hello World from Shell 

使用位置参数进行条件判断

编写一个判断脚本,根据参数执行不同操作:

sh 复制代码
#!/bin/bash

if [ "$1" == "start" ]; then
    echo "Starting the service..."
elif [ "$1" == "stop" ]; then
    echo "Stopping the service..."
else
    echo "Usage: $0 {start|stop}"
fi

保存为 service.sh 并赋予执行权限:

sh 复制代码
chmod +x service.sh

运行脚本:

sh 复制代码
./service.sh start
./service.sh stop
./service.sh status

输出:

复制代码
Starting the service...
Stopping the service...
Usage: ./service.sh {start|stop}

示例总结

打印参数信息

sh 复制代码
#!/bin/bash

echo "Script name: $0"
echo "Number of parameters: $#"
echo "All parameters (individually quoted): $@"
echo "All parameters (single quoted): $*"
echo "First parameter: $1"
echo "Second parameter: $2"

参数求和

sh 复制代码
#!/bin/bash

sum=0
for arg in "$@"; do
    sum=$((sum + arg))
done

echo "Sum of parameters: $sum"

条件判断

sh 复制代码
#!/bin/bash

if [ "$1" == "start" ]; then
    echo "Starting the service..."
elif [ "$1" == "stop" ]; then
    echo "Stopping the service..."
else
    echo "Usage: $0 {start|stop}"
fi
相关推荐
沉迷学习 日益消瘦5 分钟前
13-Ingress 生产实战
运维·kubernetes
Dawn-bit18 分钟前
Linux日志处理三剑客之基础篇:(基础正则+扩展正则)
linux·运维·服务器·正则表达式·云计算·运维开发
暗影凋落23 分钟前
docker-image 工具展示更详细镜像层内容
运维·docker·容器
深圳市爱派派智能科技有限公司36 分钟前
“进迭时空 RISC-V 集群服务器 CSB1-N10SPK3:10 节点 K3,600 TOPS 绿色算力“
运维·服务器·risc-v·k3·进迭时空·集群服务器
☆凡尘清心☆36 分钟前
Linux运维故障排查速查命令清单
linux·运维·服务器
QWEDDRFTG39 分钟前
机房供电安全
服务器
极客先躯40 分钟前
高级java每日一道面试题-2026年05月11日-实战篇[Docker]-如何容器化金融产品推荐系统?
java·运维·docker·容器·金融·高级面试·金融产品推荐系统
小泊客42 分钟前
友善R5C刷OpenWrt后RTL8822CE无线网卡显示“禁用”或“未激活”的完整解决方案
linux·github·运维开发
nvd1143 分钟前
GCP L4 Passthrough 负载均衡器“假死超时”深度排查复盘
运维·php·负载均衡
mounter6251 小时前
跨内核实时更新:如何实现 hugetlbfs 巨页的无缝保留与恢复?
linux·linux kernel·kernel·kexec·liveupdate·kho