从shell脚本中的被调用函数返回值

Mri*_*hal 114 shell return-value

我想从shell脚本中调用的函数返回值.也许我错过了语法.我尝试使用全局变量.但这也行不通.代码是:

lockdir="somedir"
test() {
    retval=""

    if mkdir "$lockdir"
        then    # Directory did not exist, but it was created successfully
            echo >&2 "successfully acquired lock: $lockdir"
            retval="true"
        else
            echo >&2 "cannot acquire lock, giving up on $lockdir"
            retval="false"
    fi
    return retval
}


retval=test()
if [ "$retval" == "true" ]
    then
        echo "directory not created"
    else
        echo "directory already created"
fi
Run Code Online (Sandbox Code Playgroud)

oli*_*bre 247

Bash函数不能像您希望的那样直接返回字符串.你可以做三件事:

  1. 回音一个字符串
  2. 返回退出状态,这是一个数字,而不是字符串
  3. 分享变量

对于其他一些shell也是如此.

以下是如何执行以下每个选项:

1.回音弦

lockdir="somedir"
testlock(){
    retval=""
    if mkdir "$lockdir"
    then # Directory did not exist, but it was created successfully
         echo >&2 "successfully acquired lock: $lockdir"
         retval="true"
    else
         echo >&2 "cannot acquire lock, giving up on $lockdir"
         retval="false"
    fi
    echo "$retval"
}

retval=$( testlock )
if [ "$retval" == "true" ]
then
     echo "directory not created"
else
     echo "directory already created"
fi
Run Code Online (Sandbox Code Playgroud)

2.退回退出状态

lockdir="somedir"
testlock(){
    if mkdir "$lockdir"
    then # Directory did not exist, but was created successfully
         echo >&2 "successfully acquired lock: $lockdir"
         retval=0
    else
         echo >&2 "cannot acquire lock, giving up on $lockdir"
         retval=1
    fi
    return "$retval"
}

testlock
retval=$?
if [ "$retval" == 0 ]
then
     echo "directory not created"
else
     echo "directory already created"
fi
Run Code Online (Sandbox Code Playgroud)

3.分享变量

lockdir="somedir"
retval=-1
testlock(){
    if mkdir "$lockdir"
    then # Directory did not exist, but it was created successfully
         echo >&2 "successfully acquired lock: $lockdir"
         retval=0
    else
         echo >&2 "cannot acquire lock, giving up on $lockdir"
         retval=1
    fi
}

testlock
if [ "$retval" == 0 ]
then
     echo "directory not created"
else
     echo "directory already created"
fi
Run Code Online (Sandbox Code Playgroud)

  • 在第二个例子中,不是从$?分配,而是编写"if testlock; then ..."更为惯用. (4认同)
  • 不要使用`function`关键字定义bash函数。这将使它的便携性降低。删除它。 (2认同)
  • 在第三个示例中,retval不是环境变量.它只是一个shell变量.它只会在导出时成为环境变量.也许第三个例子的标题应该是"全局变量"而不是"环境变量". (2认同)

Wil*_*ell 16

你的工作方式太难了.你的整个脚本应该是:

if mkdir "$lockdir" 2> /dev/null; then 
  echo lock acquired
else
  echo could not acquire lock >&2
fi
Run Code Online (Sandbox Code Playgroud)

但即使这样也可能过于冗长.我会编码:

mkdir "$lockdir" || exit 1
Run Code Online (Sandbox Code Playgroud)

但产生的错误信息有点模糊.

  • @SasQ 如果您省略了“}”之前的尾随“;”,则这是一个语法错误。该命令需要在右大括号之前终止。 (2认同)

gle*_*man 12

如果它只是一个真/假测试,那么你return 0有成功和return 1失败的功能.那么测试将是:

if function_name; then
  do something
else
  error condition
fi
Run Code Online (Sandbox Code Playgroud)


Ris*_*sal 10

如果您有一些参数要传递给函数并需要返回值。在这里,我将“12345”作为参数传递给函数,并在处理后返回变量 XYZ,该变量将被分配给 VALUE

#!/bin/bash
getValue()
{
    ABC=$1
    XYZ="something"$ABC
    echo $XYZ
}


VALUE=$( getValue "12345" )
echo $VALUE
Run Code Online (Sandbox Code Playgroud)

输出:

something12345
Run Code Online (Sandbox Code Playgroud)