shell脚本中双引号内的双引号

时间:2014-03-19 08:42:19

标签: linux bash shell

我尝试运行一个内部带双引号的命令:

insdizi=`ps -ef| grep -v grep | grep asm_pmon_ | awk ' {print $2}'`
proddizi=`ps -ef | grep asm_smon_ | grep -v grep | cut -d"_" -f3`
insname=()
homename=()
sid=()

for i in $insdizi; do
insname+=( "$i" )
a=`ls -l /proc/${insname[ii]}/cwd | awk '{print ($NF) }' |sed 's#/dbs##'`
olsnodes="${a}/bin/olsnodes"
homename+=( "$olsnodes" )
ii=`expr $ii + 1`
done

ii=`expr $ii - 1`
for i in `seq 0 $ii`; do
nodeNum= "${olsnodes}"
nodeNumm= `bash -c "${nodeSayi} |grep -c '""'"`   
echo $nodeNumm 

 echo "nodeNumm= $nodeNumm"
  for node in `bash -c "${homename[i]}"`; do
echo $node

cokluBellekKontrol $node
cokluSessionSayi $node

 done 

完成

olsnodes变量是一个从以下目录运行的命令:

   /app/oracle/grid/bin/olsnodes

以下是我需要运行的内容:

 /app/oracle/grid/bin/olsnodes | grep -c ""

我试过了:

 nodeNumm= `bash -c "${nodeNum} |grep -c '""'"`  

但它给了我错误:

"0: command not found."

修改

olsnodes的输出是:

ax1
ax2
ax3
ax4

另外,我可以用这个命令grep行数:

/u01/app/11.2.0.4/grid/bin/olsnodes |grep -c ""

1 个答案:

答案 0 :(得分:1)

单引号和双引号不会相互嵌套。只有带括号和括号的替换(${}$()$(()))可以。

您可以使用\在引号内转义引号。

nodeNumm= `bash -c "${nodeSayi} |grep -c '""'"`

应该是

nodeNumm= $(bash -c "${nodeSayi} |grep -c '\"\"'")

还是应该呢?你想做吗

grep -c ""

grep -c '""'

如果是前者,它可以简单地写成

grep -c ''

放在双引号中没有问题。

然后我怀疑,除非你期望它,否则仍然没有达到你的预期:

  • 将变量nodeNumm设置为空字符串,持续时间为
  • 运行命令,
  • 将输出作为命令执行。

如果要将nodeNumm设置为命令的输出,请使用正确的语法:

nodeNumm=$(bash -c "${nodeSayi} | grep -c '\"\"'")

然而,在子shell中运行grep没有意义,这可以让我们摆脱外部引号和整个嵌套问题。刚

nodeNumm=$(bash -c "${nodeSayi}" | grep -c '""')

请注意,我将流程替换从反引号更改为$()。这正是因为它在其他过程替换和引用方面正确嵌套。