这个 shell 命令有什么问题
What's wrong with this shell command
我正在尝试让为我们的嵌入式设备上的 busybox 编写的 shell 脚本运行。导致问题的行在下面,我将 运行ning 的输出包含在带有 -x 标志的 shell 中。
if [ cut -d : -f 1-3 /sys/class/net/eth0/address | grep -q -i 01:02:03 ]; then
# Do stuff
fi
尝试 运行 时给出的输出:
# sh -x ./script
+ [ cut -d : -f 1-3 /sys/class/net/eth0/address
sh: missing ]
+ grep -q -i 01:02:03 ]
grep: ]: No such file or directory
+ sync
我最初没有写脚本所以我不知道它什么时候停止工作。似乎用于比较的命令(如果 mac 地址前缀与给定样本匹配,则应该 return 1,否则为 0)未正确 运行 但我没有知道为什么它似乎试图将命令分开。
问题是您将 [
当作语法来使用,而在 shell 中,它是一个需要传递特定参数的命令。
我认为修复应该像删除 [
和相应的 ]
(这是 [
期望的最后一个参数)一样简单:
if cut -d : -f 1-3 /sys/class/net/eth0/address | grep -q -i 01:02:03; then
在 shell 中,if
通过查看命令的 return 代码来工作,无论它是 [
还是任何其他代码。
顺便说一句,我认为 grep
的 -i
选项在这种情况下没有任何用处,因此您可以删除它。
请注意,您的条件可以简化(感谢 chepner):
if grep -q '^01:02:03(:|$)' /sys/class/net/eth0/address; then
匹配行的开头,然后是您已有的部分,然后是冒号或行尾。
或者:
if [ "$(cut -d : -f 1-3 /sys/class/net/eth0/address)" = 01:02:03 ]; then
对 cut 命令的输出进行直接字符串比较,而不是通过管道传递给 grep。
我正在尝试让为我们的嵌入式设备上的 busybox 编写的 shell 脚本运行。导致问题的行在下面,我将 运行ning 的输出包含在带有 -x 标志的 shell 中。
if [ cut -d : -f 1-3 /sys/class/net/eth0/address | grep -q -i 01:02:03 ]; then
# Do stuff
fi
尝试 运行 时给出的输出:
# sh -x ./script
+ [ cut -d : -f 1-3 /sys/class/net/eth0/address
sh: missing ]
+ grep -q -i 01:02:03 ]
grep: ]: No such file or directory
+ sync
我最初没有写脚本所以我不知道它什么时候停止工作。似乎用于比较的命令(如果 mac 地址前缀与给定样本匹配,则应该 return 1,否则为 0)未正确 运行 但我没有知道为什么它似乎试图将命令分开。
问题是您将 [
当作语法来使用,而在 shell 中,它是一个需要传递特定参数的命令。
我认为修复应该像删除 [
和相应的 ]
(这是 [
期望的最后一个参数)一样简单:
if cut -d : -f 1-3 /sys/class/net/eth0/address | grep -q -i 01:02:03; then
在 shell 中,if
通过查看命令的 return 代码来工作,无论它是 [
还是任何其他代码。
顺便说一句,我认为 grep
的 -i
选项在这种情况下没有任何用处,因此您可以删除它。
请注意,您的条件可以简化(感谢 chepner):
if grep -q '^01:02:03(:|$)' /sys/class/net/eth0/address; then
匹配行的开头,然后是您已有的部分,然后是冒号或行尾。
或者:
if [ "$(cut -d : -f 1-3 /sys/class/net/eth0/address)" = 01:02:03 ]; then
对 cut 命令的输出进行直接字符串比较,而不是通过管道传递给 grep。