You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本中echo无法输出"*.*"字符串及字段修改需求

解决Shell中echo输出*.*显示文件列表及rsyslog.conf字段修改问题

一、echo输出*.*显示文件列表的原因与解决办法

你遇到的问题是Shell的通配符路径扩展导致的:当直接写ccvv=*.*时,Shell会自动把*.*解析成当前目录下所有包含.的文件名,再把这些文件名的列表赋值给变量ccvv。所以执行echo $ccvv时,输出的自然是展开后的文件列表,而非原始字符串*.*。

解决核心是阻止Shell对通配符进行扩展,常用方式有三种:

  • 用双引号包裹变量赋值和输出:
    ccvv="*.*"
    echo "$ccvv"  # 输出:*.*
    
  • 用单引号(单引号会完全保留原始字符串,不做任何解析):
    ccvv='*.*'
    echo "$ccvv"  # 输出:*.*
    
  • 对通配符进行转义:
    ccvv=\*\.\*
    echo "$ccvv"  # 输出:*.*
    

二、修改/etc/rsyslog.conf中的字段(保留第一个,修改第二个)

要把类似asterisk.asterisk的字符串改成*.debug,可以用sed命令实现精准批量替换:

步骤1:先备份配置文件(重要!)

修改系统配置前一定要备份,避免出错后无法恢复:

cp /etc/rsyslog.conf /etc/rsyslog.conf.bak

步骤2:执行sed替换命令

sed -i 's/^\([^.]\+\)\..*/\1.debug/' /etc/rsyslog.conf

命令解释:

  • -i:直接修改文件内容(若想先预览效果,可去掉-i,查看输出是否符合预期)
  • s/旧内容/新内容/:sed的基础替换语法
  • ^\([^.]\+\)\..*:匹配行开头的目标字符串:
    • ^:锁定行的起始位置
    • \([^.]\+\):捕获第一个字段(匹配所有非.的字符,至少1个),用括号包裹以便后续引用
    • \..*:匹配第一个.之后的所有内容
  • \1.debug:替换为捕获到的第一个字段(\1代表之前捕获的内容)加上.debug

示例验证

如果rsyslog.conf中有一行是:

asterisk.asterisk /var/log/asterisk.log

执行命令后会变成:

asterisk.debug /var/log/asterisk.log

内容的提问来源于stack exchange,提问作者chetan h

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:14:27