我有一个bash脚本,其工作原理如下:
文件结构;
主要脚本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.sh
和Hello1
字符串打印到shell中。
我该如何解决?
答案 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
是'保证支持数组等语言功能),但扩展名暗示它们会支持。