我有一个这样的脚本:
#!/bash/bin
file=`cat /proc/net/arp`
echo $file
当我运行脚本时,它会输出包含该脚本的整个文件夹,如下所示:
IP address HW type Flags HW address Mask Device 192.168.1.102 0x1 0x2 a0:88:b4:e3:f6:6c naloga1.png naloga1.txt naloga1.txt~ naloga2.png naloga2.txt naloga2.txt~ naloga3.png naloga3.sh naloga3.sh~ naloga3.txt naloga3.txt~ naloga4.png naloga4.txt naloga5.png naloga5.sh naloga5.sh~ naloga5.txt naloga6.png naloga6.txt naloga6.txt~ naloga7.png naloga7.txt naloga7.txt~ naloga8.sh naloga8.sh~ porocilo.odt tekst.txt tekst.txt~ eth0 192.168.1.1 0x1 0x2 58:6d:8f:15:fd:c3 naloga1.png naloga1.txt naloga1.txt~ naloga2.png naloga2.txt naloga2.txt~ naloga3.png naloga3.sh naloga3.sh~ naloga3.txt naloga3.txt~ naloga4.png naloga4.txt naloga5.png naloga5.sh naloga5.sh~ naloga5.txt naloga6.png naloga6.txt naloga6.txt~ naloga7.png naloga7.txt naloga7.txt~ naloga8.sh naloga8.sh~ porocilo.odt tekst.txt tekst.txt~ eth0
知道它为什么会这样吗?
答案1
该文件包含一个通配符(可能是*
),当您回显它时,变量引用周围没有双引号$file
。当 shell 扩展这样的变量引用时,它会返回该值并解析许多内容:空格(视为参数之间的分隔符)、通配符(由适当的文件名列表替换)等。将变量引用放在双引号内可避免这种额外的解析。通常,将所有变量引用放在双引号中是个好主意,除非您出于某种原因特别需要额外的解析。
顺便说一句,我也更喜欢$()
使用反引号——它们的作用基本相同,但括号版本更容易阅读。此外,在这种情况下,bash 会让您跳过命令cat
,只使用<
重定向(但请注意,这是 bash 独有的功能)。
#!/bash/bin
file=$(</proc/net/arp)
echo "$file"