我知道这是一个简单的问题,我一直在研究 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
. 可能吗?