定义和使用变量
定义变量
在 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