我有这个有效且简单的代码来回显位置参数值
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
((...))
dash
cnt++: 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 语法来递增计数器。