我尝试使用我所看到的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 '
我怎样才能只返回$的值?在运行外部命令后,给调用者?
答案 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}"