在bash中循环查找使用多个源的参数

时间:2018-12-20 19:33:02

标签: bash

我有一个bash脚本,其工作原理如下:

文件结构;

  • get.sh
  • loop.sh
  • config / param1.conf
  • config / param2.conf

主要脚本get.sh的使用;

./get.sh <param>,即./get.sh param1./get.sh param2

因此,当您使用特定的param运行脚本时,它将从config/<param>.conf获取配置文件

我想做的是运行第二个脚本./loop.sh,以便它使用./get.sh <param>文件夹内的参数以循环方式为您运行config,而没有{{ 1}}扩展名。

这是我的.conf;

loop.sh

但是这只是显示#!/bin/bash # run the script with the first param you found inside ~/config/ # folder without including it's .conf extension, # wait for 5 seconds and then do the same with the 2nd param you found for i in $(find ~/config -name '*.conf'); do ./get.sh $(basename $i) | cut -d'.' -f 1 sleep 5 done 文件夹中的param,而没有执行其他操作。 `

config里面;

config/param1.conf

var=Hello1里面;

config/param2.conf

var=Hello2里面;

get.sh

因此,毕竟,当您运行#!/bin/bash function testFunction { echo "$var" } cfg_file=$1 if [ -f "$cfg_file" ]; then . "$cfg_file" testFunction $1 exit 1 else echo "$1.conf doesn't exist" exit 1 fi 时,预期的行为应该是将loop.shHello1字符串打印到shell中。

我该如何解决?

2 个答案:

答案 0 :(得分:0)

const期望参数只是文件名,而不是整个路径名。您应该将目录用作-name的常规参数,而不应用作find的一部分。

-name

不要使用for i in $(find ~/config -name '*.conf'); do ,您应该将整个路径名传递给basename

然后在script.sh中,应使用script.sh作为配置文件的完整路径,而不是使用目录前缀将其串联。

$1

我看不到这一点:

cfg_file=$1

情况总是如此,case $1 in $1) cfg=$1 ;; esac $1不匹配吗?删除该代码。

答案 1 :(得分:0)

loop中(对bash脚本使用.sh扩展名不是好习惯):

#!/bin/bash
for i in ~/config/*.conf; do
  i_basename=${i##*/}            # change ~/config/foo.conf to just foo.conf
  i_basename=${i_basename%.conf} # change foo.conf to just foo
  ./get "$i_basename"
  sleep 5
done

${var##prefix}${var%suffix}的语法是parameter expansion;使用##时,它会从开头删除最长的匹配项(因此,对于*/,所有内容都将保留到最后一个/);与%一起使用,它将从末尾删除最短的成功匹配。


get中:

#!/bin/bash

# Using POSIX function syntax; see http://wiki.bash-hackers.org/scripting/obsolete
testFunction() {
  echo "$var"
}

cfg_file="config/$1.conf"

if [ -f "$cfg_file" ]; then
  . "$cfg_file"
  testFunction
else
  echo "$cfg_file doesn't exist"
  exit 1
fi

关于缺少.sh扩展名-UNIX命令通常没有具有扩展名(您运行ls,而不是ls.elf);同样,当您安装使用setuptools构建的Python模块时,即使这些可执行填充程序的库调用 do ,它也不会在.py中创建的填充文件上添加/usr/local/bin扩展名有这样的扩展。此外,bash和POSIX sh是两种不同的语言:以sh some-bash-only-script.sh开头时,bash脚本通常不能正确运行 (与bash不同,sh是'保证支持数组等语言功能),但扩展名暗示它们会支持。