每当我尝试使用我在脚本中实现的一个选项时,我都会收到此消息。
$ 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
答案 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
。这是重新排序的一种方式。 (注意:我使用了你的命令而没有进一步测试:)