Bourne Shell 中的单引号和变量

Bourne Shell 中的单引号和变量

我有这个命令,正尝试在 Solaris 9 的 Bourne shell 中执行。

find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | ${PARSEDATA}' {} \; >> ${TMP_1}

我的问题是,变量${PARSEDATA}无法正常工作,我尝试在其周围使用双引号,那么问题就是$0执行此代码的脚本的名称,而不是使用命令找到的文件find

任何可以解决这个问题(可能是简单的问题)的建议都非常有帮助。

提前致谢。

更新: $0是使用命令定位的脚本的名称find,变量${PARSEDATA}是过滤器,位于系统某处,用于修改每个定位脚本的输出。但是,问题是,我似乎无法同时获得两者$0${PARSEDATA}正确扩展,要么$0使用单引号扩展得很好,要么使用双引号${PARSEDATA}扩展得很好,但随后$0变成了运行此命令的原始脚本的名称find

答案1

我不确定你想做什么?但是如果你想要查找名为 check_* 的脚本,然后运行它并通过程序 ${PARSE_DATA} 进行管道传输,那么我猜 find 找到的文件不是,$0但是{}

例子

查找 /var/ftp/mp3 -name "*.mp3" -type f -exec chmod 644 {} \;(维基百科)

所以我认为你可以使用双引号:

find ${DATADIR} -name "check_*" -type f -exec sh -c '{} | ${PARSEDATA}' \; >> ${TMP_1}

我已经成功尝试:

PG='sed s/Blah/Bleh/'
find . -name "check_*" -type f -exec sh -c "{} | $PG" \;

> Bleh Blah

答案2

保留单引号,问题很可能是您没有导出 PARSEDATA 变量。

export PARSEDATA
find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | ${PARSEDATA}' {} \; >> ${TMP_1}

答案3

如果您希望 $0 不被 shell 扩展(使用单引号)并且 ${PARSEDATA} 被扩展,那么为什么不对每个使用不同的引号:

find ${DATADIR} -name "check_*" -type f -exec sh -c '$0 | '"${PARSEDATA}" {} \; >> ${TMP_1}

只要你保持引用的部分连接在一起,shell 就会扩展 ${PARSEDATA} 并将整个命令作为单个标记传递以进行查找。

相关内容