나는 이것이 간단한 질문이라는 것을 알고 있으며 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"
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다