gpt4 book ai didi

linux - 传递\*作为参数的参数

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:44 27 4
gpt4 key购买 nike

使用 ksh。尝试重用当前脚本而不修改它,基本上可以归结为如下内容:

 `expr 5 $1 $2`

如何将乘法命令 (*) 作为参数 $1 传递?

我首先尝试使用“*”,甚至是\*,但没有用。我尝试了多个转义反斜杠和引号组合,但我认为我做错了。

最佳答案

如果不修改脚本,我不认为这是可以做到的:

  • 调用时,您可以传递文字 * 作为 '*'"*"\*(任何都可以):这将最初保护 * 免受 shell 扩展(由 shell 解释)。

  • 被调用者(脚本)随后将接收文字 *(如 $1),但由于 未加引号 $1 在脚本中的使用,* 总是会受到文件名扩展(通配)的影响,并且会扩展到所有 (非隐藏)当前文件夹中的文件名,破坏了 expr 命令。

  • 尝试添加额外的转义层 - 例如 "'*'"\\\* - 将不起作用,因为额外的转义将成为参数的嵌入的文字部分 - 目标脚本将看到文字 '*'\* 并将其原样传递给 expr,这将失败,因为两者都不是有效的运算符。


这是一个解决方法:

  • 切换到一个 目录。
    • 默认情况下,如果没有匹配的文件名,ksh 将返回任何 glob(模式)原样。因此,*(或任何其他 glob)将在 目录中保持不变,因为没有任何匹配项(谢谢,@Peter Cordes)。
    • 对于调用 脚本/交互式 shell,您可以通过运行 set -f 完全禁用 globbing,但请注意,这不会影响调用 脚本。
  • 现在可以安全地使用 '*'(或任何其他 glob)调用您的脚本,因为它会被简单地传递;例如,script '*' 2,现在将按预期产生 10
    • 如果您从 调用的 shell 和 脚本的 shell 都是 ksh(或 bash)及其默认配置,您甚至可以得到使用 script * 2;即,您可以在不完全引用 * 的情况下进行。

关于linux - 传递\*作为参数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33293187/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com