无法使用选项执行我的脚本

时间:2014-08-27 20:23:18

标签: bash

每当我尝试使用我在脚本中实现的一个选项时,我都会收到此消息。

$ sh ss9.sh -d u1
mv: invalid option -- 'd'

我不知道我的剧本中我做错了什么。

#!/bin/bash
for dir in "$@"
do
mv "$dir"/* /tmp
done

if [ $# -lt 1 ] ; then
echo "ERROR: no argument"
exit 1  # pas 0
else
case $# in
-d) mv -R $dir/* /tmp        
   ;;
-x) find -executable -type f | xargs mv -t "$dir"/* /tmp
   ;;
esac
fi

4 个答案:

答案 0 :(得分:0)

isse是第一个循环遍历脚本的参数并期望它们是目录。但-d不是目录。但是,mv会尝试将其作为一个处理,但确实会失败。

解决方案可能是首先检查参数(如-d),然后将其余参数传递给for循环。

答案 1 :(得分:0)

你的脚本得到了参数:-d u1

for dir in "$@"   #processing -d u1
do
mv "$dir"/* /tmp  # here will get: mv -d/* /tmp
done

您应该在开始时处理开关。对于帮助者,请参阅getopt

答案 2 :(得分:0)

脚本中的第一个循环依次将每个参数传递给mv命令,包括任何预期的选项。当shell尝试执行命令

时,会发出您看到的错误
mv -d/* /tmp

如果您希望脚本支持选项以及非选项参数,那么您需要区分它们。

答案 3 :(得分:0)

您可以对脚本的逻辑进行重新排序,以帮助解决您的每种操作模式,而无需任何一个选项导致另一个选项出现问题。这样做的一种方法是处理和响应case语句中的所有输入。例如:

#!/bin/bash

[ -n "$1" ] || {
    echo "Error: insufficient input. usage: ${0##*/} -d -x dirname"
    exit 1
}

case "$1" in
    -d )
        mv -R $dir/* /tmp
        ;;
    -x )
        find -executable -type f | xargs mv -t "$dir"/* /tmp
        ;;
    *  )
        for dir in "$@"; do
            [ -e "$dir" ] && mv "$dir"/* /tmp
        done
        ;;
esac

exit 0

在这里,您测试您是否有输入,如果没有提供使用和退出。如果有输入,那么如果-d回复mv-x回复您的find,最后如果没有其他匹配,请使用{{1}如果您的输入是存在的文件/目录,则case语句为测试,如果存在,则为default。这是重新排序的一种方式。 (注意:我使用了你的命令而没有进一步测试:)