Unix/Linux - 特殊变量

你好,有抱负的程序员们!我很高兴能成为你探索Unix和Linux特殊变量世界的向导。作为一位有着多年计算机科学教学经验的人,我可以向你保证,掌握这些概念将在你的编程冒险中产生游戏性的改变。那么,让我们开始吧!

Unix / Linux - Special Variables

特殊变量介绍

在我们深入了解细节之前,让我们先了解什么是特殊变量。在Unix和Linux中,特殊变量是预定义的变量,它们包含了关于shell环境和当前进程的特定信息。它们就像shell世界的秘密特工,总是准备着提供关键情报!

命令行参数

命令行参数是什么?

命令行参数是在你运行脚本时提供给脚本的额外信息。它们就像是在机器人开始任务之前给它的指令。

让我们来看一个简单的例子:

#!/bin/bash
echo "Hello, $1!"

如果我们把这个脚本保存为greet.sh并以./greet.sh Alice运行它,它将输出:

Hello, Alice!

在这里,$1是一个特殊变量,代表第一个命令行参数。

使用多个参数

我们不仅限于一个参数。让我们扩展我们的脚本:

#!/bin/bash
echo "Hello, $1! Welcome to $2."

现在,如果我们运行./greet.sh Alice Wonderland,我们将得到:

Hello, Alice! Welcome to Wonderland.

在这里,$1代表"Alice",$2代表"Wonderland"。

$0变量

还有一个值得提到的特殊变量:$0。这个变量代表脚本本身的名字。让我们修改我们的脚本:

#!/bin/bash
echo "This script is called $0"
echo "Hello, $1! Welcome to $2."

运行./greet.sh Alice Wonderland现在输出:

This script is called ./greet.sh
Hello, Alice! Welcome to Wonderland.

特殊参数$*$@

现在,让我们来谈谈两个非常有用的特殊参数:$*$@。它们就像命令行参数的动态二人组!

$*参数

$*参数代表了所有命令行参数作为一个字符串。就像把所有的参数放在一个篮子里。这里有一个例子:

#!/bin/bash
echo "All arguments using \$*: $*"

如果我们以./args.sh apple banana cherry运行这个脚本,我们将得到:

All arguments using $*: apple banana cherry

$@参数

$@参数和它相似,但它将每个参数视为一个独立的实体。就像把每个参数放在它自己的小盒子里。让我们看看它是如何工作的:

#!/bin/bash
echo "All arguments using \$@:"
for arg in "$@"
do
echo $arg
done

./args.sh apple banana cherry运行这个脚本会得到:

All arguments using $@:
apple
banana
cherry

$*$@之间的区别

你可能想知道:“它们看起来对我来说是一样的!”当我们在双引号中使用它们时,区别就会显现出来。让我们创建一个脚本来演示:

#!/bin/bash
echo "Using \$*:"
for arg in "$*"
do
echo $arg
done

echo "Using \$@:"
for arg in "$@"
do
echo $arg
done

如果我们以./difference.sh "Hello World" OpenAI ChatGPT运行这个脚本,我们将得到:

Using $*:
Hello World OpenAI ChatGPT

Using $@:
Hello World
OpenAI
ChatGPT

看到区别了吗?"$*"将所有参数视为一个字符串,而"$@"保留了各个参数。

退出状态

最后但同样重要的是,让我们来谈谈退出状态。在Unix和Linux中,每个命令在执行完毕时都会返回一个退出状态。这个状态是一个介于0到255之间的数字,其中0通常意味着成功,而任何其他数字表示错误。

$?变量

最后一个执行命令的退出状态存储在$?变量中。让我们看看它是如何工作的:

#!/bin/bash
ls /nonexistent_directory
echo "Exit status of ls command: $?"

echo "Hello, World!"
echo "Exit status of echo command: $?"

运行这个脚本可能会输出:

ls: cannot access '/nonexistent_directory': No such file or directory
Exit status of ls command: 2
Hello, World!
Exit status of echo command: 0

ls命令失败了(退出状态2),而echo命令成功了(退出状态0)。

在脚本中使用退出状态

我们可以使用退出状态在脚本中做决定。这里有一个例子:

#!/bin/bash
ping -c 1 google.com > /dev/null

if [ $? -eq 0 ]
then
echo "Internet is working!"
else
echo "Internet is not working!"
fi

这个脚本ping一次Google,并检查退出状态。如果是0(成功),那么就意味着互联网在工作。

结论

恭喜你!你已经在你Unix/Linux编程旅程中迈出了重要的一步。这些特殊变量可能看起来很小,但它们是你编程工具箱中非常强大的工具。记住,熟能生巧,所以不要犹豫,在你自己的脚本中尝试这些概念。

下面是我们覆盖的特殊变量的快速参考表:

变量 描述
$0 脚本的名字
$1, $2, ... 命令行参数
$* 所有参数作为一个字符串
$@ 所有参数作为独立的字符串
$? 最后一个命令的退出状态

继续编码,继续学习,最重要的是,享受乐趣!下次见,快乐编程!

Credits: Image by storyset