Linux 之 Shell 特殊变量详解

文章
林里克斯

Shell 特殊变量: $0,$n,$!,$@,$#,$$,$*,$-,$?.

Linux 之 Shell 特殊变量详解


试验平台:CentOS Linux release 7.6.1810


特殊变量列表

变量 含义
$0 运行的当前脚本文件名;需要注意的如果入参超过 10 个(包含 10),需要使用 ${10} 这种形式
$n 传递给脚本或函数的入参; n 是一个数字,例如,第一个参数是 $1,第二个参数是 $2
$! Shell 最后运行的后台的 PID
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到
$# 传递给脚本或函数的参数个数
$$ 当前 bash 的进程号,对于 Shell 脚本,就是这些脚本所在的进程 ID
$* 传递给脚本或函数的所有参数
$- 使用 Set 命令设定的内容
$? 上个命令运行的退出状态,或函数的返回值

1.效果

$ cat a.sh
#!/bin/bash

echo "脚本名:$0"
echo "第一个入参:$1"
echo "第二个入参:$2"
echo "引用的全部参数:$@"
echo "应用入参的个数:$#"
echo "当前进程ID:$$"
echo "引用的全部参数:$*"
echo "运行是否成功 0|n :$?"

执行结果如下:

$ sh a.sh a1 a2 a4 a5
脚本名:a.sh
第一个入参:a1
第二个入参:a2
引用的全部参数:a1 a2 a4 a5
应用入参的个数:4
当前进程ID:7652
引用的全部参数:a1 a2 a4 a5
运行是否成功 0|n :0

2.$n n10 的情况

需要注意的是$10 不能获取第十个参数,获取第十个参数需要 ${10}。当 n>=10 时,需要使用 ${n} 来获取参数

$ cat b.sh
#!/bin/bash
num(){
    echo "第一个参数: $1"
    echo "第二个参数: $2"
    echo "不带大括号: $10"
    echo "第十个参数: ${10}"
    echo "num11 ${11}"
    echo "参数个数: $#"
    echo "传递给函数的所有参数: $*"
}
num 1 2 3 4 5 6 7 8 9 10 111 222 333

执行结果如下:

$ sh b.sh 
第一个参数: 1
第二个参数: 2
不带大括号: 10
第十个参数: 10
num11 111
参数个数: 13
传递给函数的所有参数: 1 2 3 4 5 6 7 8 9 10 111 222 333

3.$*$@ 的区别

$*$@ 都表示传递给函数或脚本的所有参数,不被双引号 (" ") 包含时,都以 "$1" "$2" … "$n" 的形式输出所有参数。但是当它们被双引号 (" ") 包含时,"$*" 会将所有的参数作为一个整体,以 "$1 $2 … $n" 的形式输出所有参数;"$@" 会将各个参数分开,以 "$1" "$2" … "$n" 的形式输出所有参数。

$ cat c.sh
#!/bin/bash
echo "\$*=" $*
echo "\"\$*\"=" "$*"
echo "\$@=" $@
echo "\"\$@\"=" "$@"
echo "print each param from \$*"
for var in $*
do
    echo "$var"
done
echo "print each param from \$@"
for var in $@
do
    echo "$var"
done
#echo "print each param from \"\$*\""
echo "print each param from '$*'"
for var in "$*"
do
    echo "$var"
done
#echo "print each param from \"\$@\""
echo "print each param from '$@'"
for var in "$@"
do
    echo "$var"
done

执行结果如下:

$ sh c.sh a b c d
$*= a b c d
"$*"= a b c d
$@= a b c d
"$@"= a b c d
print each param from $*
a
b
c
d
print each param from $@
a
b
c
d
print each param from 'a b c d'
a b c d
print each param from 'a b c d'
a
b
c
d

4.退出状态与返回值

$? 可以获取上一个命令的退出状态。就是查看其运行是否有报错

$ sh d.sh

echo "Hello World!"
echo $?
0

$? 也可以表示函数的返回值

$ cat e.sh
#/bin/bash
function num()
     {
         echo $1,$2;
         return $(($1+$2));
     }
num 5 7;
total=$(num 3 2);
echo $total,$?;

执行的结果如下:


$ sh return.sh
5,7
3,2,5
``

注:需要注意的是无法使用 `aa=$?` 这样的用法调用返回值,使用 `echo $aa` 输出会是空。

---

Over~

版权协议须知!

本篇文章来源于 Uambiguous ,如本文章侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意

660 0 2020-12-10


分享:
icon_mrgreen.gificon_neutral.gificon_twisted.gificon_arrow.gificon_eek.gificon_smile.gificon_confused.gificon_cool.gificon_evil.gificon_biggrin.gificon_idea.gificon_redface.gificon_razz.gificon_rolleyes.gificon_wink.gificon_cry.gificon_surprised.gificon_lol.gificon_mad.gificon_sad.gificon_exclaim.gificon_question.gif
博主卡片
林里克斯 博主大人
一个致力于Linux的运维平台
运维时间
搭建这个平台,只为分享及记载自己所遇之事和难题。

现在时间 2024-05-02

今日天气
站点统计
  • 文章总数:240篇
  • 分类总数:29个
  • 评论总数:10条
  • 本站总访问量 217871 次

@奥奥

@Wong arrhenius 牛比

@MakerFace 厉害了!