在函数中创建一个目录,然后在Bash

时间:2015-07-30 23:16:18

标签: linux bash

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

所以,我试图创建一个创建目录树的小脚本,使用我从调用函数传递的根目录,然后我想返回调用函数的完整路径。这就是我到目前为止所拥有的:

#!/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,因为我只用了一周或者其他东西,所以我'我主要是为测试和学习目的而编写这个脚本。我对这个小函数的意图是创建一个路径来存储给定位置的日志文件,然后返回调用函数的完整路径,以便我可以使用该路径在' ../无功/日志'

但是当我从另一个脚本调用此函数时,就像这样:

#!/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

这不打印任何东西......我想要做的就是返回' ../ var / log ''作为一个字符串,但eval一直将$ __ fullPath视为一个目录而且让我头疼......

从我的代码中可以看出,我不知道自己在做什么,所以请解释一下我做错了什么,以及正确的方法去做我想做的事情。做。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

您有两种方法可以从bash函数返回一个字符串:

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

    function createLogPath(){
        local __BASE="$1/var/log"
    
        mkdir -p $__BASE
    
        if [ $? -eq 0 ]
        then
            __fullPath=$( sed "$__BASE" )
            echo $__fullPath
        fi
    }
    

    并使用$()运算符检索它,如下所示:

    RESULT=$(createLogPath $BASE)
    
  2. 使用导出,如下所示:

    function createLogPath(){
        local __BASE="$1/var/log"
    
        mkdir -p $__BASE
    
        if [ $? -eq 0 ]
        then
            __fullPath=$( sed "$__BASE" )
            export RESULT=$__fullPath
        fi
    }
    
  3. (尽管可以简化,但与原始代码保持一致。)