0

我知道这是一个简单的问题,我一直在研究 getopts 教程和示例,但我被卡住了。如果您检查链接,您将看到在@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 

现在,脚本像这样工作$ ./tablooku.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. 这样,我就可以使脚本正常工作。但是,还有一个小问题。如果我输入,该代码将起作用$ ./tablooku.sh -r 3 -c 2 -f tablom.dat。但是,我需要它运行而无需编写-f. 可能吗?

4

2 回答 2

1

在这些行中:

        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 要在 using 后获取剩余的参数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"
于 2014-01-17T14:42:50.950 回答
0

您在设置 $row、$col 和 $fi 的位置缺少分号。

        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

应该是(在 之前的分号echo):

        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

如果没有这些分号,您的命令将不会像您预期的那样运行,正如您可以看到查看 bash -x 的输出并使用 -gt 检查这些行:

bash-[576]$ bash -x foo.bash -r 3 -c 3 -f foo
+ str1='Hata: '
+ str2='. satır '
+ str3='. sütun yok'
+ getopts r:c:f: opts
+ case $opts in
+ row=3
+ echo '-r was triggered, Parameter: 3'
-r was triggered, Parameter: 3
+ getopts r:c:f: opts
+ case $opts in
+ col=3
+ echo '-c was triggered, Parameter: 3'
-c was triggered, Parameter: 3
+ getopts r:c:f: opts
+ case $opts in
+ fi=foo
+ echo '-f was triggered, Parameter: foo'
-f was triggered, Parameter: foo
+ getopts r:c:f: opts
+ '[' -gt 3 ']'
foo.bash: line 18: [: -gt: unary operator expected
+ '[' -gt 3 ']'
foo.bash: line 20: [: -gt: unary operator expected
+ awk 'NR==r{print $c}' r= c=

使用分号:

bash-[574]$ bash -x foo.bash -r 3 -c 3 -f foo
+ str1='Hata: '
+ str2='. satır '
+ str3='. sütun yok'
+ getopts r:c:f: opts
+ case $opts in
+ row=3
+ echo '-r was triggered, Parameter: 3'
-r was triggered, Parameter: 3
+ getopts r:c:f: opts
+ case $opts in
+ col=3
+ echo '-c was triggered, Parameter: 3'
-c was triggered, Parameter: 3
+ getopts r:c:f: opts
+ case $opts in
+ fi=foo
+ echo '-f was triggered, Parameter: foo'
-f was triggered, Parameter: foo
+ getopts r:c:f: opts
+ '[' 3 -gt 3 ']'
+ '[' 3 -gt 3 ']'
+ awk 'NR==r{print $c}' r=3 c=3 foo

再次,查看带有 -gt 的行。因此,您的 $row、$col 和 $fi 变量设置在没有;.

于 2014-01-17T14:59:24.317 回答