Shell脚本中遇到的一些细节问题

关于字符串的单引号,双引号

#!/usr/bin/ksh -p

hotplug_dev="/pci@340/pci@1/pci@0/pci@5/SUNW,emlxs@0,2"

tmpfile=$(mktemp)
cat > $tmpfile << EOF
/
/    ONLINE
/pci@340
{ PCI Express Root Complex }
/pci@340  1,0>  ONLINE
/pci@340/pci@1
/pci@340/pci@1  0,0>  ONLINE
/pci@340/pci@1/pci@0
/pci@340/pci@1/pci@0  5,0>  ONLINE
/pci@340/pci@1/pci@0/pci@5
/pci@340/pci@1/pci@0/pci@5  0,2>  ONLINE
/pci@340/pci@1/pci@0/pci@5/SUNW,emlxs@0,2
/pci@340/pci@1/pci@0/pci@5/SUNW,emlxs@0,2/fp
/pci@340/pci@1/pci@0/pci@5/SUNW,emlxs@0,2/fp/disk
/pci@340/pci@1/pci@0/pci@5/SUNW,emlxs@0,2/fp/st
/pci@340/pci@1/pci@0/pci@5/SUNW,emlxs@0,2/fp@0,0
    { IO Multipathing PHCI (online) }
    { IOV virtual function 'pci.0,2' }
    { IOV virtual function 'pci.0,3' }
/pci@340/pci@1/pci@0/pci@5  0,3>  ONLINE
/pci@340/pci@1/pci@0/pci@5/SUNW,emlxs@0,3
/pci@340/pci@1/pci@0/pci@5/SUNW,emlxs@0,3/fp
/pci@340/pci@1/pci@0/pci@5/SUNW,emlxs@0,3/fp/disk
/pci@340/pci@1/pci@0/pci@5/SUNW,emlxs@0,3/fp/st
/pci@340/pci@1/pci@0/pci@5/SUNW,emlxs@0,3/fp@0,0
    { IO Multipathing PHCI (online) }
EOF

hotplug_dev_format=$(echo $hotplug_dev|sed 's/\//\\\//g')
#hotplug_dev_format=${hotplug_dev//\//\\\/}
print $hotplug_dev_format
print "sed -n '/^${hotplug_dev_format}$/=' $tmpfile"
hotplug_dev_num=$(sed -n '/^${hotplug_dev_format}$/=' $tmpfile)
print $hotplug_dev_num

这段代码是某一个function的片段,其主要就是想获得hotplug_dev在tmpfile文件中所处的行数,继而通过该行数去取得想要的某一行

这段代码中的需要注意的点:

print "sed -n '/^${hotplug_dev_format}$/=' $tmpfile"

这句的结果就是

sed -n '/^$\/pci@340\/pci@1\/pci@0\/pci@5\/SUNW,emlxs@0,2$/=' $tmpfile

那么接下来执行这句

hotplug_dev_num=$(sed -n '/^${hotplug_dev_format}$/=' $tmpfile)

按理说应该执行的就是

sed -n '/^$\/pci@340\/pci@1\/pci@0\/pci@5\/SUNW,emlxs@0,2$/=' $tmpfile

但是其实得到的是空值,我自己手工在终端得到的就是12,但是在脚本中运行却为空值当换成下面的双引号后就会得到正确的结果.

hotplug_dev_num=$(sed -n "/^${hotplug_dev_format}$/=" $tmpfile)

这里就涉及到了单引号双引号的问题了

你可能感兴趣的:(Linux)