shell 的位置参数

2023-05-16

positional parameters

 

位置参数(positional parameters)指的是 shell 脚本的命令行参数(command line argument),同时也表示 shell 函数的函数参数。

位置参数的名称是以单个整数来命名的。出于历史的原因,当这个整数大于 9 时(也就是包含两个或两个以上的阿拉伯数字),就应该使用花括号({})将其括起来。变量 ${nn} 表示第 nn 个位置参数;如不使用花括号,变量 $nn 的值不是第 nn 个位置参数的值,而是第 n 个位置参数的值后面加上 n。

如变量 $1、$2、$9、${11} 分别表示第一个、第二个、第九个、第十一个位置参数,依次类推。

位置参数是 shell 中唯一使用全部阿拉伯数字的特殊变量。

 

实例1:

假设 test.sh 文件的内容为:

#! /bin/bash

echo $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 ${10} ${11};

 

执行的命令行参数为:bash test.sh 1 2 3 4 5 6 7 8 9 11 12

执行后输出:

1 2 3 4 5 6 7 8 9 10 11 12

在这个结果中 $10=10,${10}=11,${11}=12。变量 $10 实际上是 $1 后面加一个 0,所有结果是 10。


和位置参数有关的几个特殊变量

$#

表示传递到 shell 脚本或函数的参数总数(也就是命令行参数或函数参数的总数)。

当为了处理选项和参数而建立的循环时,这个变量非常有用。

 

$* $@

表示所有的命令行参数和函数参数。

 

"$*"

将所有的命令行参数和函数参数视为单个字符串。等同于 "$1 $2 ..."。

特殊变量 $IFS 的第一个字符用来作为分隔字符,通过不同的分隔字符来建立字符串。在使用 $IFS 时需要注意,这个变量是一个全局变量,在任何地方改变了其值,将立即生效。

 

"$@"

将所有的命令行参数和函数参数视为单个个体,也就是单独的字符串。等同于 "$1" "$2" ...。

这是将参数传递给其他程序(其他 shell 脚本、函数)的最佳方式,因为它会保留所有内嵌在每个位置参数里的任何空白。

 

实例1:

假设 test.sh 文件的内容为:

#! /bin/bash

 

test_times=0;

 

test_positional_parameters()

{

    printf "func $test_times=%dn" $((test_times++));

    printf "func $1=%sn" $1;

    printf "func $2=%sn" $2;

    printf "func $3=%sn" $3;

    printf "func $#=%dn" $#;

    printf "func $*=%sn" $*;

    printf "func $@=%sn" $@;

    printf "func $*=$*n";

    printf "func "$*"=%sn" "$*";

    printf "func "$@"=%sn" "$@";

}

 

test_positional_parameters $*;

test_positional_parameters $@;

test_positional_parameters "$*";

test_positional_parameters "$@";

printf "main $1=%sn" "$1";

printf "main $2=%sn" "$2";

printf "main $3=%sn" "$3";

printf "main $#=%dn" $#;

printf "main $*=%sn" $*;

printf "main $@=%sn" $@;

printf "main $*=$*n";

printf "main "$*"=%sn" "$*";

printf "main "$@"=%sn" "$@";

 

执行的命令行参数为:bash test.sh 1 "4   5"

执行后输出:

func $test_times=0

func $1=1

func $2=4

func $3=5

func $#=3

func $*=1

func $*=4

func $*=5

func $@=1

func $@=4

func $@=5

func $*=1 4 5

func "$*"=1 4 5

func "$@"=1

func "$@"=4

func "$@"=5

func $test_times=1

func $1=1

func $2=4

func $3=5

func $#=3

func $*=1

func $*=4

func $*=5

func $@=1

func $@=4

func $@=5

func $*=1 4 5

func "$*"=1 4 5

func "$@"=1

func "$@"=4

func "$@"=5

func $test_times=2

func $1=1

func $1=4

func $1=5

func $2=

func $3=

func $#=1

func $*=1

func $*=4

func $*=5

func $@=1

func $@=4

func $@=5

func $*=1 4   5

func "$*"=1 4   5

func "$@"=1 4   5

func $test_times=3

func $1=1

func $2=4

func $2=5

func $3=

func $#=2

func $*=1

func $*=4

func $*=5

func $@=1

func $@=4

func $@=5

func $*=1 4   5

func "$*"=1 4   5

func "$@"=1

func "$@"=4   5

main $1=1

main $2=4   5

main $3=

main $#=2

main $*=1

main $*=4

main $*=5

main $@=1

main $@=4

main $@=5

main $*=1 4   5

main "$*"=1 4   5

main "$@"=1

main "$@"=4   5

 

特殊变量 $* $@ "$*" "$@" 传递到其他程序时的区别

1 $* 是以 $1 $2 ... $n 的形式传递的,这样将会去掉空白,位置参数个数将不确定。

$@ 是以 $1 $2 ... $n 的形式传递的,这样将会去掉空白,位置参数个数将不确定。

3 "$*" 是以 "$1 $2 ..." 形式传递的,所以传递后的位置参数仅有一个。

4 "$@" 是以 "$1" "$2" ... 的形式传递的,所以传递后的位置参数能原样保持,且能保留空白。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shell 的位置参数 的相关文章

  • 使用 Bash 比较 PHP 版本号?

    我有这个脚本 应该确保用户当前的 PHP 版本在某个范围内 尽管它应该可以工作 但某个地方有一个错误 使它认为版本超出范围 有人可以看一下并告诉我我能做什么来解决它 function version echo gawk F printf d
  • 创建 QT 应用程序作为 Windows 上现有基于控制台的应用程序的 GUI

    我正在尝试使用 Qt 为现有应用程序设置一个 GUI 该应用程序旨在在 Windows 命令行中运行 这不仅仅是运行应用程序system 命令 但我需要通过命令行与现有应用程序交互 The system 当我启动现有的可执行文件时 命令会阻
  • 删除损坏的链接 Unix

    我想删除损坏的链接 但在此之前我想确认目录中是否存在链接文件 我们来调用一下链接A if a A then print ya A is ther fi But if A链接已损坏 那么我该如何检查 find L type l找到损坏的符号链
  • 用于解析文件( csv )并逐行处理的 Shell 脚本[重复]

    这个问题在这里已经有答案了 您好 需要一个 shell 脚本来解析 csv 文件 逐行解析 然后逐个字段 该文件将如下所示 X1 X2 X3 X4 Y1 Y2 Y3 Y4 我需要提取这些 X1 X2 我写了一个脚本 但如果行超过一行 它就会
  • 重写 openshift maven 脚本 (jenkins gear)

    我在 Openshift 上有 Jenkins 实例 我已启用 Jenkins 构建我的 Openshift 应用程序 这里是 Jenkins shell 脚本的一部分并记录它们生成的内容 Sync any libraries rsync
  • 如何在 Python 中将列表变量传递给 subprocess.call 命令

    我有一个清单 apps apps append wq35a5huqlja45jsyukrpmwuiayovrmh apps append q7mimvgduueernwvw4y22t5huemykntw apps append pmudbp
  • 如何在接收端打开没有 SSHD 的 shell?

    我有一台没有 SSHD 的机器 我想从远程机器 我可以完全控制 在这台机器上打开 bash shell 由于我的有限机器上有 SSH 因此我配置了反向代理 ssh R 19999 localhost 22 remoteuser remote
  • 使用单个 shell 脚本运行 React 和 Flask

    我构建了一个使用 ReactJS 作为前端和 Flask 作为中间件的应用程序 我可以使用以下命令序列来执行它 npm start cd Equation Solver python m flask run 执行第一个命令后 我必须打开另一
  • 如何从 Emacs 中运行 Cygwin Bash Shell?

    我在 Windows 上运行 GNU Emacs 因此输入 M x shell 启动 Windows 命令行 DOS shell 但是 我希望能够从 Emacs 中运行 Cygwin Bash Shell 或任何其他非 Windows sh
  • shell进程的并行执行

    有没有一个工具可以在 Windows 批处理文件中并行执行多个进程 我发现了一些有趣的 Linux 工具 parallel http mi eng cam ac uk er258 code parallel html and PPSS ht
  • 如何通过管道将输入和输出传送到交互式 shell?

    我正在尝试构建一个应用程序 使用户能够与命令行交互式 shell 例如 IRB 或 Python 进行交互 这意味着我需要将用户输入通过管道传输到 shell 并将 shell 的输出返回给用户 我希望这会像管道 STDIN STDOUT
  • 如何在 ubuntu 上的 emacs 中运行 shell 命令,同时避免 bash 作业控制错误?

    我在 ubuntu 中安装了 emacs 使用 sudo apt get install emacs 我遇到的问题是 当我尝试从 emacs 中运行 shell 命令时 例如M ls 输出之前是这样的 bash cannot set ter
  • 使用 AWK 或 SED 以及以下标签以逗号分隔

    使用 AWK 或 SED 以及下面使用的标签以逗号分隔 BEGIN AccountID BEGIN CallerID BEGIN Billed Account Attributes 1111111 1111111 1111111 END B
  • 使用 sh shell 比较字符串

    我正在使用 SH shell 我试图将字符串与变量的值进行比较 但是if条件始终执行为真 为什么 这是一些代码 Sourcesystem ABC if Sourcesystem eq XYZ then echo Sourcesystem M
  • 在 bash 函数中生成后台进程

    我正在编写一个 Bash 函数来启动需要从某个文件夹启动的服务器 但我不希望启动该服务器影响我当前的工作 我写了以下内容 function startsrv pushd cd TRUNK SERVERCOMMAND popd 我的变量都已设
  • 寻找下一个开放端口

    有没有什么办法 使用基本的 Unix 命令 找到下一个未使用的端口号 从端口 4444 开始向上 我通过 ssh 通过 openssh 进入 Windows XP 计算机 运行 Cygwin 工具并使用 bash shell 谢谢 戴夫 尝
  • 如何使用 cron 作业运行 python 文件

    您好 我创建了一个 python 文件 例如file example py 该文件将输出 sensex 值 假设该文件在linux系统上的路径为 Desktop downloads file example py 我通常会运行该文件pyth
  • 如何在 Bash 中为数组赋值?

    我正在尝试从文本文件中读取值列表 你好 txt 并将它们存储在一个数组中 counter 0 cat hello txt while read line do Unix Array counter line let counter coun
  • bash双括号问题

    我对 bash 脚本非常陌生 在使用双括号时遇到了问题 我似乎无法让它们在 Ubuntu Server 11 10 中工作 我的下面的脚本位于 if test sh 中 bin bash if 14 14 then echo FOO fi
  • 如何在Windows Git shell中运行./script.sh?

    也许这很尴尬 但是当我在 Git shell 中工作时 我无法在 Windows 上运行 sh 文件 也许我必须安装一些东西 但我认为 Git 会支持 bash 命令 我知道 Windows 不使用 sh 文件 我正在执行安装步骤游戏结束

随机推荐