我昨天开发的代码,将文件(x.txt)或空格分隔数字(434 435 436 437)作为输入,并将数据推送到数组中并循环通过。
Syntax: shtest.sh 434 435 436 or sh test.sh x.txt
MYFILE=$1 ;
OLDIFS=$IFS;
IFS=' ';
if [ -f "$MYFILE" ]; then
testCases=($(cat $MYFILE));
else
testCases=($@);
fi
for testCase in "${testCases[@]}"
do
echo "Running Testcases $testCase"
done
我想这样做的方式,以减少错误
我希望在运行上述脚本并将文件作为参数时实际拥有一个标志
sh test.sh -f myFile.txt
或者可以使用-t flasg运行,并使用数字作为参数
sh test.sh -t 434 435 436
如果-f和-t都存在,那么我必须检查并抛出错误
例如:sh test.sh -f myFile.sh -t 343 435 435或
sh test.sh -t 343 435 435 -f myFile.sh
我昨天刚开始研究Shell Scripting,而且我真的不知道如何在语法上做到这一点
最后,如果我们有标记文件或带标记的数字参数(根本没有Unfalgged),下面的代码是否有用或者是否有任何问题 语法:
sh test.sh -f myFile.txt #should work
sh test.sh -t 443 444 443 443 # should work
sh test.sh -f myFile.txt -t 443 444 443 443 # should fail
isFile=0;
isTest=0;
while getopts ":f:c:t:" opt; do
case $opt in
f)
echo "-f was triggered, Parameter: $OPTARG" >&2
testCases=($(cat $OPTARG));
isFile=1;
;;
t)
# testCases=($@);
multi+=("$OPTARG")
for val in "${multi[@]}"; do
echo " - $val"
done
;;
c)
echo "-c was triggered, Parameter: $OPTARG" >&2;
isTest=1;
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
:)
echo "Option -$OPTARG requires an argument." >&2
exit 1
;;
esac
done
# Exit if both flags are sent
if [ isTest==1 && isFile==1 ]; then
{
echo "Exiting";
}
fi
#if the flag is not avaiable, the store the orphan numbers (Command Line Arguments)
for testCase in "${testCases[@]}"
do
echo "Running Testcases $testCase"
done
请提供意见和任何帮助表示赞赏。
由于 特加斯
答案 0 :(得分:0)
在while getopts
循环后,添加:
shift $(($OPTIND - 1))
if [ $isFile = 0 ] && [ $# = 0 ]
then
echo "$0: must specify file (-f file) or numbers" >&2
exit 1
fi
我假设您在循环之前有isFile=0
。如果您未明确设置它,则可以继承用户意外设置的环境变量。请务必小心,不要意外地使用调用脚本的代码中的环境变量。