[英]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.