我试图将标志和变量存储到脚本中。我需要-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
答案 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
应该有预期的效果。