为什么我的bash程序挂起而不是返回值?

时间:2014-12-08 15:26:43

标签: bash

我尝试使用我所看到的here从bash函数返回一个值。但由于某种原因,我的脚本只是挂起而不是从函数返回一个值。我做错了什么(在Ubuntu上运行)?

#!/bin/bash
...

function check_ftp_file_exists {
  local ftp_path=$1

  echo "Checking whether remote path $ftp_path exists on FTP server $FTP_HOST..."
  echo "ls $1" | sftp -b - -i $FTP_PEM_FILE ${FTP_USER}@${FTP_HOST}
  echo "$?"
}

retval=$(check_ftp_file_exists $FILE_PATH)
echo "here retval is $retval"      # never get here

- 更新 - 在上面的内容中,SFTP命令似乎出现了错误,即使我已将其从正常工作的其他脚本中解除了。

现在更大的问题是使用' $()'似乎返回我在函数内部回显的任何内容,而不仅仅是运行外部命令的返回代码,这是我想要的。

E.g。

function exit_on_error {
  local return_code=$1
  local error_message=$2

  if [[ $return_code -ne 0 ]]; then
    echo "$error_message"
    exit $return_code
  fi
}

function get_s3_file {
  local s3_path=$1
  local local_path=$2

  echo "Downloading $s3_path to $local_path..."
  $(aws s3 cp $s3_path $local_path)
  echo "$?"
}

if [[ ! -e "$FTP_PEM_FILE" ]]; then
  exit_on_error $(get_s3_file $S3_PEM_PATH "/tmp/") "Failed to retrieve pem file "
fi

运行上面的代码会给出以下调试输出:

+ exit_on_error 'Failed to retrieve pem file '
+ local 'return_code=Failed to retrieve pem file '

我怎样才能只返回$的值?在运行外部命令后,给调用者?

1 个答案:

答案 0 :(得分:1)

这就是$()的作用,它扩展为命令/函数产生的输出。如果你想要返回代码,你只需在调用命令/函数后阅读$?,例如:

OUTPUT=$(grep "root" /etc/passwd)
RETCODE=$?
echo "output: ${OUTPUT}"
echo "retcode: ${RETCODE}"

OUTPUT=$(grep "blablabla" /etc/passwd)
RETCODE=$?
echo "output: ${OUTPUT}"
echo "retcode: ${RETCODE}"

func1()
{
    grep "root" /etc/passwd
}

func2()
{
    grep "blablabla" /etc/passwd
}

OUTPUT=$(func1)
RETCODE=$?
echo "output: ${OUTPUT}"
echo "retcode: ${RETCODE}"

OUTPUT=$(func2)
RETCODE=$?
echo "output: ${OUTPUT}"
echo "retcode: ${RETCODE}"

如果在函数内部,你想在调用命令之后再做一些事情,并在返回它的返回码之前,你必须记住变量中的返回码,然后在最后使用return语句功能,例如:

func3()
{
    grep "root" /etc/passwd
    local RETCODE=$?
    # ...
    echo "The End"
    return ${RETCODE}
}

func4()
{
    grep "blablabla" /etc/passwd
    local RETCODE=$?
    # ...
    echo "The End"
    return ${RETCODE}
}

OUTPUT=$(func3)
RETCODE=$?
echo "output: ${OUTPUT}"
echo "retcode: ${RETCODE}"

OUTPUT=$(func4)
RETCODE=$?
echo "output: ${OUTPUT}"
echo "retcode: ${RETCODE}"