FILE_LIST=$1
MOVE=0
while getopts "m" OPT; do
case $OPT in
m) MOVE=1 ;;
M) MOVE=1 ;;
*) echo "Invalid parameter." >&2; exit 1 ;;
esac
done
echo $MOVE
echo $FILE_LIST
我将传递可选参数(-m / -M)和文件列表。
test.sh -m a.txt
显示1 -m ,
,但我正在寻找1 a.txt
Supost if test.sh a.xt
它应该是diplsay 0 and a.txt
答案 0 :(得分:2)
您需要shift
参数。
MOVE=0
while getopts "mM" OPT; do
case $OPT in
M|m) MOVE=1
shift;;
*) echo "Invalid parameter." >&2; exit 1 ;;
esac
done
echo $MOVE
FILE_LIST=$1
echo $FILE_LIST
您还可以将m
和M
合并为一个案例。
答案 1 :(得分:0)
如果我理解正确,您希望运行脚本的语法类似于:
./scriptname [-mM] firstfile [secondfile ...]
如果这是正确的,那么其他任何答案都不能正常工作;这是我怎么做的:
#!/bin/bash
# Parse command options
MOVE=0
while getopts "mM" OPT; do
case "$OPT" in
m|M) MOVE=1 ;;
*) echo "Invalid option." >&2; exit 1 ;;
esac
done
shift $(( OPTIND-1 )) # Remove options from the argument list
# Parse command arguments
if [[ $# -eq 0 ]]; then
echo "No files specified." >&2
exit 1
fi
FILE_LIST=( "$@" ) # Use an array in case of spaces in filenames
# Some examples of things to do with the results:
# Work with the specified files individually:
for FILE in "${FILE_LIST[@]}"; do
chmod g+w "$FILE"
done
# Work with the specified files as a group:
if (( MOVE == 1 )); then
mv "${FILE_LIST[@]}" "$DEST_DIR"
else
cp "${FILE_LIST[@]}" "$DEST_DIR"
fi
答案 2 :(得分:-1)
我不知道你想要什么,但这里有一些代码示例: 第一个示例假定文件列表始终在-m选项
之后给出while getopts "m:" OPT
do
case $OPT in
m)
echo "option m"
FILE_LIST = $OPTARG
;;
*)
echo "error"
;;
esac
done
echo $FILE_LIST
或者使用与-m选项
无关的文件列表的其他方法while getopts "m:" OPT
do
case $OPT in
m)
echo "option m"
MOVE = 1
;;
*)
echo "error"
;;
esac
done
shift $(($OPTIND - 1))
FILE_LIST = $1
echo $FILE_LIST
希望这符合您的需求
答案 3 :(得分:-1)
您必须使用$OPTARG
值。请注意m:
。冒号指定传递给-m
#!/bin/bash
MOVE=0
while getopts "m:M:" OPT; do
case $OPT in
m|M) MOVE=1
FILE_LIST="$FILE_LIST $OPTARG"
;;
*) echo "Invalid parameter." >&2; exit 1 ;;
esac
done
shift $(( OPTIND-1 ))
[[ $MOVE != 1 ]] && FILE_LIST=$1
echo $MOVE
echo $FILE_LIST