bash -c 命令串里面有单引号怎么办?

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
jinhongchao@gmail.com
帖子: 286
注册时间: 2008-06-24 21:00

bash -c 命令串里面有单引号怎么办?

#1

帖子 jinhongchao@gmail.com » 2014-12-12 15:32

代码: 全选

bash -c 'convert -font ~/MSYH.TTF  -pointsize 80 -draw 'text 400,400 "正立行衣帽"' a.jpg b.jpg'
头像
susbarbatus
帖子: 2966
注册时间: 2010-04-10 16:14
系统: Arch Linux

Re: bash -c 命令串里面有单引号怎么办?

#2

帖子 susbarbatus » 2014-12-12 15:53

代码: 全选

bash -c "convert -font ~/MSYH.TTF  -pointsize 80 -draw 'text 400,400 \"正立行衣帽\"' a.jpg b.jpg"
沉迷将棋中……
头像
jinhongchao@gmail.com
帖子: 286
注册时间: 2008-06-24 21:00

Re: bash -c 命令串里面有单引号怎么办?

#3

帖子 jinhongchao@gmail.com » 2014-12-12 18:12

麻烦看一下为啥name赋不了值

代码: 全选

find . -iname '*.JPG' -print0|xargs -n1 -0 -I {} bash -c "name={};echo $name"
如果命令串用单引号

代码: 全选

find . -iname '*.JPG' -print0|xargs -n1 -0 -I {} bash -c 'name={};echo $name'
倒是可以的.

但是命令串里如果带有单引号的内容.就又出错了.
头像
susbarbatus
帖子: 2966
注册时间: 2010-04-10 16:14
系统: Arch Linux

Re: bash -c 命令串里面有单引号怎么办?

#4

帖子 susbarbatus » 2014-12-12 22:26

代码: 全选

find . -iname '*.JPG' -print0|xargs -n1 -0 -I {} bash -c "name={};echo \$name"
如果用双引号,那么引号内的特殊字符会被 bash 解释,
注意你输入命令的终端是一个 shell,它首先会解释这个特殊字符,
然后你调用的 bash 会解释第二次。

这里的场景,如果用单引号,那么 $ 这个特殊字符不会被解释,而是原样传给了调用的 bash,由这个 bash 去解释,
如果用双引号, $name 被外面的 shell 给解引用了(如果没赋过值那么就是个空字符串),于是传到里面的 bash 的实际命令是

代码: 全选

name={};echo

加个 \ 转义即可。
沉迷将棋中……
回复