看shell脚本的时候,发现两个奇怪的用法 $@
和 $?
sh run_task.python $@
RETURN_VALUE=$?
if [ ${RETURN_VALUE} -ne 0 ]; then
echo "xx.sh job error!"
exit 1
fi
1. 来看 $@
$@
是一个特殊的 shell 变量,在 shell 脚本中用来表示所有传递给脚本的命令行参数。当在一个脚本中使用 $@
,它会展开成调用该脚本时传递的所有参数,每个参数作为独立的字符串。
例如,假设有一个名为 wrapper_script.sh
的脚本,内容如下:
#!/bin/bash
# wrapper_script.sh
# 调用另一个脚本,并将所有传递给本脚本的参数传递给那个脚本
sh run_task.python $@
如果运行这个 wrapper_script.sh
并传递一些参数:
./wrapper_script.sh arg1 arg2 arg3
那么 wrapper_script.sh
会执行 run_task.python
脚本,并将 arg1
、arg2
和 arg3
作为参数传递给它,就像你直接运行了以下命令:
sh run_task.python arg1 arg2 arg3
$@
确保了所有传递给 wrapper_script.sh
的参数都被原封不动地传递给 run_task.python
脚本。
在编写需要传递参数的脚本时,$@
是非常有用的,因为它允许脚本灵活地处理任意数量的参数,并将这些参数传递给其他命令或脚本。
2. 来看 $?
$?
是一个特殊的变量,代表上一个命令执行的退出状态码(exit status)。退出状态码是一个数字,通常用于表示命令执行的成功与否。按照惯例:
如果 $?
返回 0
,表示上一个命令执行成功。
如果 $?
返回非 0 值,表示上一个命令执行失败或遇到错误。具体的非零值可以提供关于错误类型的额外信息。
在最上面的脚本中
RETURN_VALUE=$?
这行代码将上一个命令的退出状态码赋值给变量 RETURN_VALUE
。这样,你就可以在后续的脚本中使用这个变量来检查之前的命令是否执行成功,或者根据退出状态码来执行不同的操作。
看个例子:
#!/bin/bash
# 尝试复制一个文件
cp source.txt destination.txt
# 捕获退出状态码
RETURN_VALUE=$?
# 根据退出状态码判断命令是否执行成功
if [ $RETURN_VALUE -eq 0 ]; then
echo "File copied successfully."
else
echo "Error occurred while copying the file."
fi
在这个脚本中,cp
命令用于复制文件。如果复制成功,$?
将返回 0
,否则返回非 0
值。然后,脚本使用 RETURN_VALUE
变量来存储这个退出状态码,并根据其值输出相应的消息。