错误讯息:
Syntax error: "(" unexpected (expecting "fi")
/sbin/modprobe.sh: 2: /sbin/modprobe.sh: EOF: not found
/sbin/modprobe.sh: 10: /sbin/modprobe.sh: Syntax error: "(" unexpected (expecting "fi")
Shell脚本:
EOF
#!/bin/bash
if [[ \$1 == -l ]]
then
if [ -z \$2 ]
then
find /lib/modules/\$(uname -r) -name '*.ko' | sed -e "s#\\/lib\/modules\/\$(uname -r)\/##g"
else
find /lib/modules/\$(uname -r) -name '*.ko' | sed -e "s#\/lib\/modules\/\$(uname -r)\/##g" | grep \$2
fi
else
/sbin/modprobe \$@
fi
EOF
答案 0 :(得分:1)
这是你的脚本,重写为工作。
#!/bin/bash
if [ x$1 = x-l ] ; then
BASE=/lib/modules/$(uname -r)/
if [ x$2 = x ] ; then
find $BASE -name '*.ko' | sed -e "s#$BASE##g"
else
find $BASE -name '*.ko' | sed -e "s#$BASE##g" | grep $2
fi
else
/sbin/modprobe $@
fi
你的主要问题是大量的反斜杠打破了剧本。如果您使用$(command)
来获取命令的输出,则需要保留该美元符号; \$(command)
将变成文字字符串"$(command)"
,这不是您想要的。同样,您的sed
命令行使用#
字符来分隔搜索和替换字符串,因此您不需要在路径中的斜杠之前添加反斜杠。同样,您需要为第二个参数设置$2
; \$2
是文字字符串"$2"
。
我使用了一个通用约定来测试$1
和$2
参数:我在测试中放了一个x
。这甚至可以在旧的古怪的UNIX shell中运行。我想在Linux上使用GNU Bash你可以依靠内置的[
运算符,但这样做仍然有用。
另请注意我如何缩进if
/ else
语句。这纯粹是一种风格的东西,你不必按照我的方式做事,但我觉得这是最具可读性的。
最后,这个脚本接近复杂程度,我会考虑用比Bash更强大的语言重写它。我个人更喜欢Python,但你可以使用Ruby或任何你喜欢的东西。