Linux 在函数中创建一个目录,然后在Bash中将path作为字符串返回给调用者

Linux 在函数中创建一个目录,然后在Bash中将path作为字符串返回给调用者,linux,bash,Linux,Bash,这是我第一次在这里发帖。我不知道是否有人问过这个问题,但我在任何地方都找不到答案 因此,我尝试创建一个小脚本,创建一个目录树,使用我从调用函数传递的根目录作为参数,然后我想返回调用函数的完整路径。以下是我目前掌握的情况: #!/bin/bash function createLogPath(){ local __BASE="$1/var/log" local __fullPath=$2 mkdir -p $__BASE if [ $? -eq 0] then __

这是我第一次在这里发帖。我不知道是否有人问过这个问题,但我在任何地方都找不到答案

因此,我尝试创建一个小脚本,创建一个目录树,使用我从调用函数传递的根目录作为参数,然后我想返回调用函数的完整路径。以下是我目前掌握的情况:

#!/bin/bash
function createLogPath(){
  local __BASE="$1/var/log"
  local __fullPath=$2

  mkdir -p $__BASE

  if [ $? -eq 0]
  then
    __fullPath=$( sed "$__BASE" )
    eval $__fullPath
  fi
}
正如您可能从我的代码中看到的,关于Bash,有几点我仍然没有掌握,因为我只使用它一周左右,所以我编写这个脚本主要是为了测试和学习。我使用这个小函数的目的是创建一个路径,在给定位置存储日志文件,然后返回调用方函数的完整路径,以便我可以使用该路径在“../var/log”中创建日志文件

但当我从另一个脚本调用此函数时,如下所示:

#!/bin/bash
. makedir.sh  # That's the name of the script where createLogPath() is

BASE=$1
RESULT=''

createLogPath $BASE $RESULT

printf "The path is: %s\n" $RESULT
RESULT=$(createLogPath $BASE)
function createLogPath(){
    local __BASE="$1/var/log"

    mkdir -p $__BASE

    if [ $? -eq 0 ]
    then
        __fullPath=$( sed "$__BASE" )
        export RESULT=$__fullPath
    fi
}
这不是打印任何东西。。。我想做的是将“../var/log”的完整路径作为字符串返回,但eval一直将$\u fullPath视为目录,这让我很头疼


正如您从我的代码中看到的,我不知道我在做什么,所以请解释我做错了什么,以及我尝试做什么的正确方法。任何建议都将不胜感激。

Bash函数参数是通过值传递的,而不是通过引用传递的。也就是说,为函数内部的参数赋值不会影响函数外部的变量

有两种可能从bash函数返回字符串:

  • 将其回显到标准输出,例如:

    function createLogPath(){
        local __BASE="$1/var/log"
    
        mkdir -p $__BASE
    
        if [ $? -eq 0 ]
        then
            __fullPath=$( sed "$__BASE" )
            echo $__fullPath
        fi
    }
    
    并使用$()运算符检索它,如下所示:

    #!/bin/bash
    . makedir.sh  # That's the name of the script where createLogPath() is
    
    BASE=$1
    RESULT=''
    
    createLogPath $BASE $RESULT
    
    printf "The path is: %s\n" $RESULT
    
    RESULT=$(createLogPath $BASE)
    
    function createLogPath(){
        local __BASE="$1/var/log"
    
        mkdir -p $__BASE
    
        if [ $? -eq 0 ]
        then
            __fullPath=$( sed "$__BASE" )
            export RESULT=$__fullPath
        fi
    }
    
  • 使用导出,如下所示:

    #!/bin/bash
    . makedir.sh  # That's the name of the script where createLogPath() is
    
    BASE=$1
    RESULT=''
    
    createLogPath $BASE $RESULT
    
    printf "The path is: %s\n" $RESULT
    
    RESULT=$(createLogPath $BASE)
    
    function createLogPath(){
        local __BASE="$1/var/log"
    
        mkdir -p $__BASE
    
        if [ $? -eq 0 ]
        then
            __fullPath=$( sed "$__BASE" )
            export RESULT=$__fullPath
        fi
    }
    

  • (尽管可以简化,但要尽可能接近原始代码。)

    无需导出
    RESULT
    默认情况下是一个全局变量,当调用方返回
    createLogPath
    时,调用方可以看到它(假设它没有在子shell中执行,例如在命令替换中)。@Tilman Schmidt dude,非常感谢,问题是当我返回带有“echo$\uu fullPath”的字符串时,我没有使用“RESULT”=$(createLogPath$BASE)'来存储它。我得到的只是每次调用函数时都会回显的路径,这就是为什么我一开始没有使用回显的原因。但是你帮我看到了曙光。非常感谢。调用
    sed
    ?它阻止了当前编写的等待输入的脚本。@chepner有人建议将此作为一种打开脚本的方法一个到字符串的路径,但这是另一个问题,我只是尝试不同的解决方案,这是我试图做的脚本的最后一个版本,所以我把它放在那里了。我真的不知道“sed”是用来做什么的。