Bash脚本无输出,但相同逻辑的单行命令可正常输出
Bash脚本无输出但单行管道正常的问题排查与解决
我编写了一段Bash脚本,执行后没有任何输出;但将相同逻辑写成单行管道命令时,却能得到正确的输出结果。
脚本与单行命令对比
脚本内容
#!/bin/bash URL="localhost:3000" content=$(curl -s $URL | sed -E 's/<[^>]*>//g') vidsWatched=$(echo $content | grep -A 3 "Videos Watched" | sed -n 4p) echo "$vidsWatched"
单行命令
curl -s "http://localhost:3000" | sed -E 's/<[^>]*>//g' | grep -A 3 "Videos Watched" | sed -n 4p
单行命令输出
600
问题原因
变量存储丢失换行结构
Bash中用$(...)捕获命令输出时,会自动将输出里的换行符替换为空格(遵循IFS默认处理规则)。后续用echo "$content"输出时,原本的多行内容被合并成一行,导致grep -A 3 "Videos Watched"无法匹配原有的行结构——-A 3是取匹配行及后面3行,但所有内容都在一行时,自然找不到对应的第4行,最终sed -n 4p无输出。URL缺少协议头
脚本中的URL="localhost:3000"未指定http://,虽然curl部分环境下会自动补全协议,但存在环境差异,可能导致返回内容和单行命令不一致。
解决方法
方法一:直接使用管道串联命令(推荐)
保留单行命令的管道结构,避免变量存储破坏行结构:
#!/bin/bash URL="http://localhost:3000" curl -s "$URL" | sed -E 's/<[^>]*>//g' | grep -A 3 "Videos Watched" | sed -n 4p
方法二:保留变量中的换行符
如果必须用变量存储内容,用printf "%s" "$content"代替echo "$content",确保输出时保留原始换行:
#!/bin/bash URL="http://localhost:3000" content=$(curl -s "$URL" | sed -E 's/<[^>]*>//g') vidsWatched=$(printf "%s" "$content" | grep -A 3 "Videos Watched" | sed -n 4p) echo "$vidsWatched"
内容的提问来源于stack exchange,提问作者dacghgfctfy
相关产品推荐
相关产品推荐

