簡體   English   中英

Bash:使用getopts傳遞參數

[英]Bash: Passing parameters using getopts

我知道這是一個簡單的問題,我一直在研究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:

如果括號我改變了]]][[[ 現在, unary operator expected錯誤已消失。 現在,提示等待並且不打印-f was triggered, Parameter:...我仍然使用ctrl+z來打破等待。

更新2:

在@grebneke和@TimK的建議下,我添加了分號並將fi參數更改為fil 這樣,我就可以運行腳本了。 但是,仍然存在一個小問題。 如果輸入$ ./tablooku.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"

您在設置$ 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查看行。 因此,如果沒有$,$ col和$ fi的變量設置,則不會傳播;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM