shell get opt是catputre $ 1作为参数

时间:2011-08-09 13:39:02

标签: bash shell

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

4 个答案:

答案 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

您还可以将mM合并为一个案例。

答案 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