【问题标题】:How to pass argument in the custom bash function as part of a dir path?如何将自定义 bash 函数中的参数作为 dir 路径的一部分传递?
【发布时间】:2019-12-28 15:32:19
【问题描述】:

我想定义一个自定义 bash 函数,它获取一个参数作为 dir 路径的一部分。

我是 bash 脚本的新手。在线提供的代码让我感到困惑或无法正常工作。


例如,预期的 bash 脚本如下所示:

function my_copy() {
    sudo cp ~/workspace/{$1} ~/tmp/{$2} 
}

如果我输入my_copy a b

然后我希望函数执行sudo cp ~/workspace/a ~/tmp/b 在终端中。


提前致谢。

【问题讨论】:

    标签: linux bash shell terminal command


    【解决方案1】:

    如果您在 copy.sh 文件中有以下函数,并且如果您 source 它(source copy.sh. copy.sh),那么函数调用 my_copy 将按预期工作。

    $1$2positional parameters

    即当您调用my_copy a b 时,$1 将具有第一个命令行参数作为其值,在您的情况下为a$2 是第二个命令行参数,将具有值b。该功能将按预期工作。

    另外你在函数中有一个逻辑错误,你给了{$1}而不是${1}。它将在您的函数中扩展为{a} 而不是a,并且当您运行它时,它会抛出一个错误,上面写着cp: cannot stat '~/workspace/{a}': No such file or directory

    另外,如果位置参数的个数大于10个,则需要在两者之间使用{},否则可以避免。例如:${11} 而不是 $11

       function my_copy() {
            sudo cp ~/workspace/$1 ~/tmp/$2 
        }
    

    所以上面的函数会按预期执行语句sudo cp ~/workspace/a ~/tmp/b

    要理解这个概念,您可以在脚本中尝试echo $1echo ${1}echo {$1}echo {$2}echo ${2}echo $2 以查看结果值。 For more special $ sign shell variables

    【讨论】:

      【解决方案2】:

      您的代码中存在语法错误。你不会调用像{$foo} 这样的变量。如果1=a2=b 则执行

      sudo cp ~/workspace/{$1} ~/tmp/{$2}

      BASH 将用a 替换$1,用b 替换$2,因此,BASH 将执行

      sudo cp ~/workspace/{a} ~/tmp/{b}

      这意味着 cp 将失败,因为没有像 {a} 这样名称的文件

      有一些方法可以调用变量

      echo $foo

      echo ${foo}

      echo "$foo"

      echo "${foo}"

      否则,您的代码看起来不错,应该可以工作。

      看看这个链接firstsecond,引用你的变量真的很重要。如果您想了解有关 BASH 的更多信息或晚上无法入睡,请尝试使用 Official Manual,它包含您必须了解的有关 BASH 的所有信息,而且它也是一个很好的睡眠者;)

      PS:我知道$1、$2等是位置参数,我称它为变量是因为你把它当成一个变量,而我的anwser两者都可以应用。

      【讨论】:

        猜你喜欢
        • 2021-12-02
        • 2019-08-30
        • 2013-06-03
        • 1970-01-01
        • 2011-08-06
        • 2011-11-24
        • 2014-08-01
        • 2013-01-25
        • 2010-10-08
        相关资源
        最近更新 更多