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

如何在Bash脚本中收集含引号的命令行剩余参数为字符串?

无需引号即可让Bash脚本接收含特殊字符的日志内容

我写了个叫logit的简化脚本,用来把命令行参数追加到文本文件里,同时记录时间,用法如下:

$ logit Started work on default theme

但遇到带单引号的内容时,Bash的解析规则会出问题,比如输入:

$ logit Don't forget a dark mode

Shell会认为单引号没闭合,弹出续行提示:

quote>

我知道用引号包裹参数能解决,但不想手动加引号:

# 不想用这种方式
$ logit "Don't forget a dark mode"

有没有办法让脚本在Bash处理命令行前收集剩余内容,不用手动加引号?

现有脚本的最小版本:

#!/bin/bash
log_file=~/log.txt
now=$(date +"%T %r")
echo "${now} ${@:1}" >>  $log_file

解决方案:改用读取整行输入而非命令行参数

问题根源是Bash在执行脚本前会先解析命令行参数,未闭合的引号会触发续行提示,脚本根本没机会接收参数。要绕过这个限制,最好的办法是让脚本直接读取整行输入,而非依赖命令行参数。

方法1:修改脚本读取标准输入

修改后的脚本:

#!/bin/bash
log_file=~/log.txt
now=$(date +"%T %r")
# 读取整行输入,保留所有特殊字符
read -r msg
echo "${now} ${msg}" >> "$log_file"

用法:
运行脚本后直接输入日志内容(包括带单引号的内容),回车即可:

$ logit
Don't forget a dark mode

也可以用管道传递内容:

$ echo Don't forget a dark mode | logit

方法2:定义Bash函数(更便捷)

把logit做成Bash函数,直接读取用户输入,不用单独的脚本文件:

logit() {
    local now=$(date +"%T %r")
    local msg
    # 带提示符读取整行输入
    read -r -e -p "log> " msg
    echo "${now} ${msg}" >> ~/log.txt
}

把这段代码添加到你的~/.bashrc或~/.bash_profile里,重启终端或执行source ~/.bashrc生效后,直接输入logit,在提示符后输入日志内容即可,无需引号:

$ logit
log> Don't forget a dark mode

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 11:30:51