shell脚本(busybox)不';t在docker容器上按预期工作
使用busybox和ash运行基于图像的alpine:shell脚本(busybox)不';t在docker容器上按预期工作,docker,shell,sh,busybox,Docker,Shell,Sh,Busybox,使用busybox和ash运行基于图像的alpine: /mnt/builddir/code/src/main/helm # busybox | head -1 BusyBox v1.31.1 () multi-call binary. 我编写了一个sh脚本,仅当文件名以前缀“values”开头时才打印文件名,但带有“if”条件的某些内容无法正常工作。这是我的剧本: for f in ./* do echo ${f##*/} if ${f##*/} == 'values'*; then
/mnt/builddir/code/src/main/helm # busybox | head -1
BusyBox v1.31.1 () multi-call binary.
我编写了一个sh脚本,仅当文件名以前缀“values”开头时才打印文件名,但带有“if”条件的某些内容无法正常工作。这是我的剧本:
for f in ./*
do
echo ${f##*/}
if ${f##*/} == 'values'*; then
echo $f
fi
done
输出:
/mnt/builddir/code/src/main/helm # ./script.sh
Chart.yaml
./script.sh: line 4: Chart.yaml: not found
script.sh
./script.sh: line 4: script.sh: not found
values-feature.yaml
./script.sh: line 4: values-feature.yaml: not found
values-int.yaml
./script.sh: line 4: values-int.yaml: not found
values-prod.yaml
./script.sh: line 4: values-prod.yaml: not found
values-stg.yaml
./script.sh: line 4: values-stg.yaml: not found
values.yaml
./script.sh: line 4: values.yaml: not found
在我将代码更改为上述代码之前,if条件如下所示:
if [[ ${f##*/} == values* ]]
then
...
但这也不行
感谢您的建议…此脚本中有两个明显的问题:在
if
行中,您没有调用测试(1),而是直接尝试运行每个文件;而test(1)=
操作符只进行精确的字符串比较,而不进行glob或regex匹配
您可以使用shellcase
语句将变量与glob匹配:
中的“$f”情况
*/值*)
回音“$f”
;;
以撒
但是shellfor
语句可以在glob扩展上迭代,这通常是一种更简单的设置:
值*中的f的;做
回音“$f”
完成
(这完全不是Docker特有的,我希望您在主机上直接运行脚本时会遇到类似的错误。您可能会发现,如果没有Docker作为您和您试图修复的代码之间的隔离层,开发和调试脚本会容易得多。)您的问题自相矛盾:您将其标记为bash,但在标题中你写的是“sh”。对于bash,
[${f##*/}==values*]
将有意义;对于sh
显然不是。此外,这两种方法都不能很好地发挥作用,这是轶事证据,但不是问题描述。在第一个示例中,您关闭了括号/值),但没有打开。这是故意的吗?@I.zv,这是case
语法,请参阅help case