gpt4 book ai didi

linux - Bash:使用 getopts 传递参数

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:41 25 4
gpt4 key购买 nike

我知道这是一个简单的问题,我一直在研究 getopts 教程和示例,但我被卡住了。如果你检查 this链接,您将看到在@fedorqui 的帮助下,我已经设法编写代码以获取文件中的数组元素。

但是,我需要的是对输入进行参数化,这样即使我更改了输入的顺序,脚本也能继续工作。

这是我写的第一段代码:

#!/bin/bash

file=$3 row=$1 col=$2 str1="Hata: " str2=". satır " str3=". sütun yok"

if [ $row -gt 3 ]
then
echo $str1$row$str2$col$str3
elif [ $col -gt 3 ]
then
echo $str1$row$str2$col$str3
else
awk 'NR==row{print $col}' row=$row col=$col $file
fi

现在,脚本的工作方式类似于 $ ./tabloku.sh 3 2 tablom.dat,输出为:

~/Desktop $ ./tablooku.sh 3 2 tablom.dat 
Kopenhag

我需要做的是翻译这段代码,这样当我输入 $ ./tablooku.sh -r 3 -c 2 tablom.dat 时,我的脚本就可以运行了。

这是我写的在运行时卡住的代码:

#!/bin/bash

str1="Hata: "
str2=". satır "
str3=". sütun yok"

while getopts "r:c:f:" opts
do
case $opts in
r) row=$OPTARG echo "-r was triggered, Parameter: $OPTARG";;
c) col=$OPTARG echo "-c was triggered, Parameter: $OPTARG";;
f) fi=$OPTARG echo "-f was triggered, Parameter: $OPTARG";;
\?) printf "Kullanım: %s -r değer -c değer dosya adresi\n" $0
exit 2;;
esac
done

if [ $row -gt 3 ]
then
echo $str1$row$str2$col$str3
elif [ $col -gt 3 ]
then
echo $str1$row$str2$col$str3
else
awk 'NR==r{print $c}' r=$row c=$col $fi
fi

你能告诉我这里有什么问题吗?当我运行命令时,系统输出为:

~/Desktop $ ./go_test.sh -r 3 -c 2 tablom.dat 
-r was triggered, Parameter: 3
-c was triggered, Parameter: 2
./go_test.sh: line 23: [: -gt: unary operator expected
./go_test.sh: line 26: [: -gt: unary operator expected

提示卡住,我必须使用 ctrl+z 来打破等待。看起来我没有将文件位置分配给 fi 但我无法解决问题

注意:请记住 -r 是行,-c 是列,最后一个参数是不使用任何选项代码(如 -f)的文件位置

更新 1:

我将 if 括号 ] 更改为 ]] 并将 [ 更改为 [[。现在 unary operator expected 错误消失了。现在,提示等待并且不打印 -f was triggered, Parameter:... 我仍然使用 ctrl+z 来打破等待。

更新 2:

根据@grebneke 和@TimK 的建议,我添加了分号并将fi 参数更改为fil。这样,我就可以使脚本正常工作。但是,还有一个小问题。如果我输入 $ ./tabloku.sh -r 3 -c 2 -f tablom.dat,代码就可以工作。但是,我需要它无需编写 -f 即可运行。可能吗?

最佳答案

在这些行中:

        r)     row=$OPTARG echo "-r was triggered, Parameter: $OPTARG";;
c) col=$OPTARG echo "-c was triggered, Parameter: $OPTARG";;
f) fi=$OPTARG echo "-f was triggered, Parameter: $OPTARG";;

您正在分配 row/col/fi仅用于该行的其余部分。在分配后添加一个分号,它将在脚本的其余部分保持分配状态:

        r)     row=$OPTARG; echo "-r was triggered, Parameter: $OPTARG";;
c) col=$OPTARG; echo "-c was triggered, Parameter: $OPTARG";;
f) fi=$OPTARG; echo "-f was triggered, Parameter: $OPTARG";;

编辑 <deleted, I misunderstood the question>

编辑 2使用 getopts 后获取剩余参数, 你必须 shift像这样:

while getopts "r:c:" opts
do
...
done

shift $(( $OPTIND-1 ))

# Now, $1, $2 etc are your arguments as you are used to:
$ ./tablooku.sh -r 3 -c 2 tablom.dat
# $1 will be "tablom.dat"

关于linux - Bash:使用 getopts 传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21188265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com