shell脚本(busybox)不';t在docker容器上按预期工作

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

使用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
      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匹配

您可以使用shell
case
语句将变量与glob匹配:

中的“$f”情况
*/值*)
回音“$f”
;;
以撒
但是shell
for
语句可以在glob扩展上迭代,这通常是一种更简单的设置:

值*中的f的
;做
回音“$f”
完成

(这完全不是Docker特有的,我希望您在主机上直接运行脚本时会遇到类似的错误。您可能会发现,如果没有Docker作为您和您试图修复的代码之间的隔离层,开发和调试脚本会容易得多。)

您的问题自相矛盾:您将其标记为bash,但在标题中你写的是“sh”。对于bash,
[${f##*/}==values*]
将有意义;对于
sh
显然不是。此外,这两种方法都不能很好地发挥作用,这是轶事证据,但不是问题描述。在第一个示例中,您关闭了括号/值),但没有打开。这是故意的吗?@I.zv,这是
case
语法,请参阅
help case