docker - shell 脚本(busybox)在 docker 容器上不能按预期工作
问题描述
使用 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
行中,您没有调用test (1),而是直接尝试运行每个文件;并且test (1)==
运算符只进行精确的字符串比较,而不是 glob 或正则表达式匹配。
您可以使用 shellcase
语句将变量与 glob 进行匹配:
case "$f" in
*/values*)
echo "$f"
;;
esac
但是 shellfor
语句可以遍历 glob 扩展,这将是一个通常更简单的设置:
for f in values*; do
echo "$f"
done
(这根本不是 Docker 特有的,我希望您直接在主机上运行脚本会遇到非常相似的错误。您可能会发现在没有 Docker 作为隔离层的情况下开发和调试脚本要容易得多您和您要修复的代码。)
推荐阅读
- swift - 枚举中的类型转换在 Swift 中不起作用
- python - 颜色突出显示 python wordcloud.WordCloud data-viz 中的单个键,同时使用 color_func
- android - 基本的 Android 启动器启动画面
- java - 使用while循环和嵌套for循环定制菱形(java)
- azure - 有没有办法让我将应用服务计划卸载到 Log Analytics?
- jquery - jQuery 中的数据属性无法正常工作
- swift - 使用异步 Firebase 调用 SwiftUI
- excel - 在 VBA 中,如何检查一个字符串是否包含在单元格中找到的许多字符串中的任何一个?
- python - 我该如何解决这个 UnicodeDecodeError?
- java - 将值从一种方法传递到另一种方法