将函数输出保存到参数中命名的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 }