Shell 脚本解释 Bash 特殊参数的4个示例

举报
Tiamo_T 发表于 2022/02/13 10:44:16 2022/02/13
【摘要】 我们将在本文中讨论的一些 bash 特殊参数有:$*、$@、$#、$$、$!、$?、$-、$_ 要访问整个位置参数列表,可以使用两个特殊参数 $* 和 $@。在双引号之外,这两个是等效的:都扩展为以 $1 开头的位置参数列表(由空格分隔)。 但是,在双引号内,它们有所不同:一对双引号内的 $* 相当于位置参数列表,由 IFS 的第一个字符“$1c$2c$3...”分隔。

我们将在本文中讨论的一些 bash 特殊参数有:$*、$@、$#、$$、$!、$?、$-、$_

要访问整个位置参数列表,可以使用两个特殊参数 $* 和 $@。在双引号之外,这两个是等效的:都扩展为以 $1 开头的位置参数列表(由空格分隔)。

但是,在双引号内,它们有所不同:一对双引号内的 $* 相当于位置参数列表,由 IFS 的第一个字符“$1c$2c$3...”分隔。

一对双引号内的 $@ 相当于位置参数列表,由不带引号的空格分隔,即“$1” “$2″..”$N”。

示例 1:使用 Bash $* 和 $@ 扩展位置参数

此示例显示 $* 和 $@ 中可用的值。

首先,如下所示创建expan.sh。


$ cat expan.sh
#!/bin/bash

export IFS='-'

cnt=1

# Printing the data available in $*
echo "Values of \"\$*\":"
for arg in "$*"
do
  echo "Arg #$cnt= $arg"
  let "cnt+=1"
done

cnt=1

# Printing the data available in $@
echo "Values of \"\$@\":"
for arg in "$@"
do
  echo "Arg #$cnt= $arg"
  let "cnt+=1"
done

接下来,执行如下所示的expan.sh,看看$* 和$@ 是如何工作的。

$ ./expan.sh "This is" 2 3
Values of "$*":
Arg #1= This is-2-3
Values of "$@":
Arg #1= This is
Arg #2= 2
Arg #3= 3
  • 上面的脚本使用“-”导出了 IFS(内部字段分隔符)的值。
  • 向脚本 expan.sh 传递了三个参数 $1=”This is”,$2=”2″ 和 $3=”3″。
  • 在打印特殊参数“$*”的每个值时,它只给出一个值,即由 IFS 分隔的整个位置参数。
  • 而“$@”将每个参数作为一个单独的单词提供给您。

示例 2:使用 $# 计算位置参数

$# 是 bash 中的特殊参数,它为您提供十进制位置参数的数量。

首先,如下所示创建算术.sh。

$ cat arithmetic.sh
#!/bin/bash

if [ $# -lt 2 ]
then
  echo "Usage: $0 arg1 arg2"
  exit
fi

echo -e  "\$1=$1"
echo -e "\$2=$2"

let add=$1+$2
let sub=$1-$2
let mul=$1*$2
let div=$1/$2

echo -e "Addition=$add\nSubtraction=$sub\nMultiplication=$mul\nDivision=$div\n"

如果位置参数个数小于2,会抛出如下所示的使用信息,

$ ./arithemetic.sh 10
Usage: ./arithemetic.sh arg1 arg2

示例 3:流程相关参数 - $$ 和 $!

特殊参数 $$ 将给出 shell 的进程 ID。美元!为您提供最近执行的后台进程的进程 ID。

以下脚本打印 shell 的进程 ID 和最后执行的后台进程 ID。

$ cat proc.sh
#!/bin/bash

echo -e "Process ID=$$"

sleep 1000 &

echo -e "Background Process ID=$!"

现在,执行上面的脚本,并检查其打印的进程 ID。

$ ./proc.sh
Process ID=9502
Background Process ID=9503
$ ps
  PID TTY          TIME CMD
 5970 pts/1    00:00:00 bash
 9503 pts/1    00:00:00 sleep
 9504 pts/1    00:00:00 ps
$

示例 4:其他 Bash 特殊参数 - $?、$-、$_

  • $?-给出最近执行的命令的退出状态。
  • $-使用 set 内置命令设置的选项
  • $_将最后一个参数提供给前一个命令。在 shell 启动时,它给出正在执行的 shell 脚本的绝对文件名。
$ cat others.sh
#!/bin/bash

echo -e "$_"; ## Absolute name of the file which is being executed

/usr/local/bin/dbhome  # execute the command.
#check the exit status of dbhome
if [ "$?" -ne "0" ]; then
  echo "Sorry, Command execution failed !"
fi

echo -e "$-"; #Set options - hB

echo -e $_  # Last argument of the previous command.

在上面的脚本中,最后一个 echo 语句“echo -e $_”($ 下划线)也打印了 hB,它是上一个命令的最后一个参数的值。所以 $_ 会给出展开后的值

$ ./others.sh
./others.sh
/home/oracle
Sorry, Command execution failed !
hB
hB
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。