如何将字符串变量传入notify-send?Shell脚本参数传递问题
解决Shell脚本中notify-send传递字符串变量的问题
哈哈,我之前也踩过类似的坑,给你拆解下你遇到的两个错误,再给你靠谱的实现方法~
先说说你为啥会报错
第一个命令的问题
你写的$MESSAGE='Hello world!' notify-send "$MESSAGE" -t 1有两个致命错误:
- 变量赋值格式错了:如果要给当前命令临时设置环境变量,应该是
变量名=值 命令,而不是$变量名=值——前面的$是用来读取变量的,赋值时不能加。 - 反引号
用错了:反引号的作用是执行里面的内容并返回输出,你写的"$MESSAGE"会把变量里的Hello world!当成命令去执行,Shell就会把Hello当成命令名,自然报错Hello command not found了。
第二个命令的问题
notify-send $MESSAGE -t 1的问题出在Shell的单词拆分:当你不用引号包裹变量时,Shell会把变量里的空格当作分隔符,把Hello world!拆成Hello和world!两个参数传给notify-send。而notify-send的默认用法是notify-send <标题> [内容],所以它会把Hello当成标题,world!当成内容,如果你本来只想把整个字符串作为标题(或内容),就会出现参数不符合预期的情况,看起来像是“参数过多”。
正确的实现方法
核心原则:用双引号包裹变量,避免Shell自动拆分参数,下面是几种常用场景:
场景1:单独赋值后使用(最清晰)
# 先给变量赋值 MESSAGE='Hello world!' # 用双引号包裹变量传给notify-send notify-send "$MESSAGE" -t 1
场景2:指定标题+内容
如果需要同时传标题和内容,两个变量都用双引号包裹:
TITLE='系统提示' MESSAGE='Hello world!' notify-send "$TITLE" "$MESSAGE" -t 1
场景3:一行内完成赋值+执行
如果不想单独写一行赋值,可以用&&连接,或者用临时环境变量的方式:
# 方式1:用&&串联命令 MESSAGE='Hello world!' && notify-send "$MESSAGE" -t 1 # 方式2:临时给当前命令设置环境变量(适合只给这一个命令用的情况) MESSAGE='Hello world!' notify-send "$MESSAGE" -t 1
额外提醒
- 永远记得用双引号包裹包含空格、特殊字符的变量,除非你明确希望Shell拆分它的内容。
- 反引号
是用来执行命令的(比如date命令),不要用来引用变量,引用变量用双引号就够了。
内容的提问来源于stack exchange,提问作者Spark_TheCat
相关产品推荐
相关产品推荐

