【问题标题】:Shell script is printing parameeter without passing to itShell 脚本正在打印参数而不传递给它
【发布时间】:2014-01-02 18:02:11
【问题描述】:

我在没有传递参数的情况下从 script1.sh 调用 script2.sh。但我将参数传递给 script1.sh。我正在尝试打印 script2.sh 的第一个参数。

script1.sh

#! /bin/bash
PRM1=$1
source script2.sh

script2.sh

#! /bin/bash
PRM1=$1
echo "$PRM1"

输出是

# source script1.sh hello
#hello
#

理想情况下

# source script1.sh hello

#

谁能告诉我为什么 script2.sh 将 script1.sh 参数作为参数?

【问题讨论】:

    标签: linux bash shell unix parameters


    【解决方案1】:

    来自bash(1) man page

    Shell 内置命令

    source filename [arguments]
    

    在当前 shell 环境中从 filename 读取并执行命令,并返回从 filename 执行的最后一个命令的退出状态。如果filename 不包含斜杠,则PATH 中的文件名用于查找包含filename 的目录。在PATH 中搜索的文件不必是可执行文件。当bash 不是posix 模式时,如果在PATH 中没有找到文件,则搜索当前目录。如果关闭了shopt 内置命令的sourcepath 选项,则不会搜索PATH如果提供了任何参数,它们将成为执行 filename 时的位置参数。否则位置参数不变。 返回状态是脚本中退出的最后一条命令的状态(0,如果没有执行任何命令),如果 filename 未找到或无法找到则返回 false被阅读。

    【讨论】:

    • 那么,如何克服这个问题。有什么解决方法吗?因为我想传一次参数,另一次我就不传了。这种情况该如何处理?
    • 一种解决方案是在分配PRM1=$1 后在script1.sh 中调用shift。这将丢弃脚本的第一个位置参数。或调用set -- 丢弃所有位置参数。
    【解决方案2】:

    将垃圾作为参数传递。以便位置参数将替换为它。

    【讨论】:

      【解决方案3】:

      你没有给你的 script1.sh 任何参数,因为它期望一个。 (一个小提示,我总是关闭这一行中的空白:#!/bin/bash - 而不是#! /bin/bash)。在你的 script1.sh 中,试试这个:

      #!/bin/bash
      PRM1=$1
      ./script2.sh $PRM1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-04
        • 2011-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-22
        • 1970-01-01
        相关资源
        最近更新 更多