一个计算机技术爱好者与学习者

0%

好好学Shell:Shell脚本问题记录

1. 前言

本文记录在编写Shell脚本时遇到的问题,备忘。

2. Docker输出取值问题

2.1. 问题描述

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
value=$(docker exec -it test echo '"10"')
# echo "$value"
value=${value//\"/}
if [[ $value =~ ^[0-9]+$ ]]
then
echo "running"
else
echo "failed"
fi

这段代码的期望输出为 running,实际输出为 failed ,是为什么?
其中test容器是任意一个docker容器,比如busybox。

2.2. 问题排查解决

在docker命令执行的结果中,可能包含一些看不见的控制字符。

排查方法:使用od命令查看不可见的控制字符

1
echo "$value" | od -c

可以看到输出为:

1
2
0000000   "   1   0   "  \r  \n
0000006

由此可以发现控制字符为 \r\n

解决办法:进一步处理value变量,去除控制字符。

1
value=$(echo -n "$value" | tr -d '\r\n')

2.3. 扩展学习:od命令

od命令用于将指定文件内容以八进制、十进制、十六进制、浮点格式或ASCII编码字符方式显示。通常用于显示或查看文件中不能直接显示在终端的字符。od命令系统默认的显示方式是八进制,名称源于Octal Dump。

常见的文件为文本文件和二进制文件。od命令主要用来查看保存在二进制文件中的值,按照指定格式解释文件中的数据并输出,不管是IEEE754格式的浮点数还是ASCII码,od命令都能按照需求输出它们的值。

od -c: same as -t c, select printable characters or backslash escapes

3. 直接运行和定时任务运行结果不一致问题

3.1. 问题描述

1
2
3
4
5
6
7
8
9
#!/bin/bash
value=$(docker exec -it test echo '"10"')
value=$(echo -n "$value" | tr -d '\r\n\"')
if [[ $value =~ ^[0-9]+$ ]]
then
echo "running" | tee -a /tmp/shell.log
else
echo "failed" | tee -a /tmp/shell.log
fi

上面这段代码,直接运行时结果为 running ,contab运行结果为 failed ,表现不一致,为什么?

3.2. 问题排查解决

经测试,发现 docker exec -it test echo '"10"' 命令中去掉 -it ,问题可以解决。

推测问题原因是cron作业不能添加交互式终端参数。

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-shell-problem/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~