Getopt Unix存储参数

时间:2017-01-30 16:21:43

标签: unix ksh getopt

我试图将标志和变量存储到脚本中。我需要-s用于SFTP和-o用于输出文件。我试图将这些存储到变量中以便以后使用。用法是Script.ksh -o test.txt。输出应该是

output file is: test.txt
sftpFlag=Y

脚本内容如下,

args=`getopt -o:-i:-e:-s "$@"`

for arg in $args
do
    case "$arg" in
            o)output=$arg;;
            s)sftpFlag=Y
    esac
done

echo "output file is: "$output
echo "SFTP flag is: "$sftpFlag

2 个答案:

答案 0 :(得分:1)

单个s表示它是一个标志,而o:表示它需要一个参数。 $OPTARG会给你实际的论据。

#!/bin/bash

while getopts ":so:" opt; do
  case $opt in
    o)
      output=$OPTARG
      ;;
    s) sftpFlag=Y 
       ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      ;;
  esac
done

echo "output file is: "$output
echo "SFTP flag is: "$sftpFlag

您可以将其称为$ test.sh -s -o output.txt

答案 1 :(得分:1)

问题是getopt -o:-i:-e:-s "$@"将选项传递给getopt命令本身,其中一个选项-s需要一个参数(来自手册页):

-s, --shell shell
 Set quoting conventions to those of shell.  If the -s option is not given,
 the BASH conventions are used.  Valid arguments are currently 'sh' 'bash',
 'csh', and 'tcsh'.

第二个问题是你只是分配给一个变量,这意味着$args得到了值-o test.txt -s --(来自你的例子),它在一个循环中被处理。

重写你的代码:

args=`getopt o:i:e:s "$@"`
eval set -- "$args"
while [[ -n $1 ]]
do
    case "$1" in
            -o)output=$2;shift;;
            -s)sftpFlag=Y;;
            --) break;;
    esac
    shift
done

echo "output file is: "$output
echo "SFTP flag is: "$sftpFlag

应该有预期的效果。