如何打印/回显位置参数索引

如何打印/回显位置参数索引

我有这个有效且简单的代码来回显位置参数值

for i
do
echo "Argument = $i "
done

这是脚本的实际输出

Argument = --atleast-pkgconfig-version
Argument = 0.9.0

它完成了这项工作,但我一直在试图弄清楚如何向回显输出添加索引。

这不起作用

cnt=1
for i
do
echo "Argument $cnt = $i "
((cnt++))
done

当前的代码完成了这项工作,索引只是锦上添花 - 就像这样:

Argument #1 = --atleast-pkgconfig-version
Argument #2 = 0.9.0

有任何想法吗?

更新#1

我将其作为文本编辑器的副本发布,基本上是为了绕过“5 分钟内编辑”的时间限制。

我确实运行了这两个代码,都在 #! /bin/sh 脚本。一个是直接在主脚本中运行,第二个是在从主脚本调用的脚本中运行 - 如所示。两个代码在主脚本中都运行良好,但第一个代码(我最初发布为有问题的代码)无法在辅助脚本中运行。

是的,“更可移植”的代码解决了这个问题——它在所需的脚本中正确运行。它仍然没有回答最初的问题——为什么它会失败并出现“未找到”错误。

主脚本
--exists glib-2.0                    0
--modversion glib-2.0                2.54.3
--exists --print-errors glib-2.0 >= 2.28    0
First code  - OK 
Argument #1 = dummy
Argument #2 = mt
Second code OK 
Argument #1 = dummy
Argument #2 = mt
辅助脚本

第一个代码 – 失败

/usr/bin/arm-linux-gnueabihf-pkg-config: 19: /usr/bin/arm-linux-gnueabihf-pkg-config: cnt++: not found
Argument #1 = --print-errors
/usr/bin/arm-linux-gnueabihf-pkg-config: 19: /usr/bin/arm-linux-gnueabihf-pkg-config: cnt++: not found
Argument #1 = glib-2.0 >= 2.28
/usr/bin/a
第二个代码 – 运行良好
Argument #1 = --exists
Argument #2 = --print-errors
Argument #3 = glib-2.0 >= 2.28
第一个代码
cnt=1
for i do
    echo "Argument #$cnt = $i"
    ((cnt++))
done
第二个代码
count=1
for arg do
    printf 'Argument #%d = %s\n' "$count" "$arg"
    count=$(( count + 1 ))
done

答案1

您的第二个示例只需要#输出字符串中的一个即可在运行时生成正确的输出bash

cnt=1
for i do
    echo "Argument #$cnt = $i"
    ((cnt++))
done

请注意,如果使用 执行,这通常不起作用/bin/sh,特别是如果是一个不理解算术求值语法/bin/sh的 shell(如)。当 shell 尝试在两组子 shell 中执行字符串时,它会为上面的代码生成错误。如果您需要使用上面的代码,请确保它是通过使用脚本顶部的一行来执行的。dash((...))dashcnt++: not found((cnt++))cnt++bash#!/bin/bash

为了获得最大的可移植性,您可以使用

count=1
for arg do
    printf 'Argument #%d = %s\n' "$count" "$arg"
    count=$(( count + 1 ))
done

xpg_echo如果恰好在 中启用了 shell 选项,这还可以避免包含反斜杠的参数出现问题bash,并且它使用 POSIX 语法来递增计数器。

相关内容