将函数输出保存到参数中指定的变量中

时间:2017-01-03 18:35:06

标签: bash nginx docker sh

我有一个有趣的问题,我似乎找不到答案。我正在创建一个简单的应用程序,它将帮助我的开发部门使用NginX和配置文件自动启动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部分放在不同类型的引号中,但没有任何效果。我尝试了$folder="'"$d"'"$folder=`$d`$folder="$d",但都没有效果。让我疯了,任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:2)

如果您想将结果保存到命名变量中,那么您所做的就是"间接分配&#34 ;;它涵盖在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 s(仅当使用新版本的bash时):

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

答案 1 :(得分:1)

罪魁祸首是

            // construct a scheduler factory
        IScheduler sched = StdSchedulerFactory.GetDefaultScheduler();

        // define the job and tie it to our HelloJob class
        IJobDetail job = JobBuilder.Create<HelloJob>().StoreDurably()
            .WithIdentity("myJob", "group1") // name "myJob", group "group1"
            .Build();

        sched.AddJob(job,true);

        string cron = "0 0/5 2-23 1/2 * ?"; // interval in minutes 5 2h00 and 23h00 every second day
        string cron1 = "0 30,35,40,45,50,55 1 1/2 * ?"; // 1h30 every second day

        // Trigger the job to run now, and then every 40 seconds
        ITrigger trigger = TriggerBuilder.Create()
            .WithIdentity("trigger", "group1")
            .StartNow()
            .WithCronSchedule(cron)
            .ForJob(job)
            .Build();

       ITrigger trigger1 = TriggerBuilder.Create()
                .WithIdentity("trigger1", "group1")
                .StartNow()
                .WithCronSchedule(cron1)
                .ForJob(job)
                .Build();


        // Tell quartz to schedule the job using our trigger
        sched.ScheduleJob(trigger);
        sched.ScheduleJob(trigger1);

        sched.Start();

将文件夹名称视为以$folder=$d 符号存储之前,并尝试使用该名称展开它,即字面上将名称=视为可在shell下运行但无法找到的可执行文件该名称的文件。将其更改为

=test_folder/

此外,folder=$d 函数的返回值仅限于整数类型,并且您不能将字符串发送到调用函数。如果你想向bash上的调用函数发送一个非零返回码,你可以添加一行

$folder

(或)如果要从函数返回字符串值,请不要使用if [ -z "$folder" ]; then return 1; else return 0; fi ,只需执行名称的return,并使用函数名称替换命令,即

echo