将函数输出保存到参数中命名的variables中

我有一个有趣的问题,我似乎无法find答案。 我正在创build一个简单的应用程序,它将帮助我的开发部门自动启动具有NginX和configuration文件的Docker容器。 我的问题是,由于某种原因,我不能让bash脚本存储文件夹的名称,同时扫描目录。 这是我正在谈论的一个非常简单的例子….

#!/bin/bash getFolder() { local __myResultFolder=$1 local folder for d in */ ; do $folder=$d done __myResultFolder=$folder return $folder } getFolder FOLDER echo "Using folder: $FOLDER" 

然后,我将这个简单的脚本保存为folder_test.sh,并将其放在只有一个文件夹的文件夹中,将所有者更改为我,然后授予它正确的权限。 但是,当我运行脚本,我不断收到错误…

 ./folder_test.sh: 8 ./folder_test.sh: =test_folder/: not found 

我已经尝试把$folder=$d部分在不同types的引号,但没有任何作品。 我试过$folder="'"$d"'"$folder=`$d`$folder="$d"但没有任何作品。 让我疯狂,任何帮助将不胜感激。 谢谢。

罪魁祸首是线路

 $folder=$d 

这是处理文件夹名称以存储与=符号以前,并试图扩大它的名字,即字面上看待名称=test_folder/作为一个可执行文件在shell下运行,但没有find该名称的文件。 将其更改为

 folder=$d 

此外, bash函数的返回值仅限于整数types,您不能将string发送到调用函数。 如果你想发送一个非零的返回码给$folder的调用函数为空,你可以添加一行

 if [ -z "$folder" ]; then return 1; else return 0; fi 

(或者)如果你想从函数返回一个string值,不要使用return ,只需要使用echo的名字并且用函数名称来使用命令replace即

 getFolder() { local __myResultFolder=$1 local folder for d in */ ; do folder=$d done __myResultFolder=$folder echo "$folder" } folderName=$(getFolder FOLDER) echo "$folderName" 

如果你想把你的结果保存到一个命名variables中,你所做的就是“间接赋值”。 它包含在BashFAQ#6中 。

其中一个方法如下:

 #!/bin/bash # ^^^^ not /bin/sh; bash is needed for printf -v getFolder() { local __myResultFolder=$1 local folder d for d in */ ; do folder=$d done printf -v "$__myResultFolder" %s "$folder" } getFolder folderName echo "$folderName" 

其他方法包括:

  • 使用read

     IFS= read -r -d '' "$__myResultFolder" < <(printf '%s\0' "$folder") 
  • 使用eval (非常非常仔细):

     # note \$folder -- we're only trusting the destination variable name # ...not trusting the content. eval "$__myResultFolder=\$folder" 
  • 使用namevar (仅当使用新版本的bash时):

     getFolder() { local -n __myResultFolder=$1 # ...your other logic here... __myResultFolder=$folder }