Я знаю, что это простой вопрос, и я изучал учебники и примеры 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
. Является ли это возможным?