여러 문자 플래그로 매개변수 전달하기

여러 문자 플래그로 매개변수 전달하기

내 질문은 대학에서 작성하도록 요청받은 스크립트에 관한 것이므로 H/W이지만 막혀서 아직 해결책을 찾지 못했습니다.

나는 다음과 같은 주장을 얻으려고 노력하고 있습니다

./tool.sh -f persons.dat -id <id> 

그 사람의 데이터를 표시하고 싶기 때문입니다.

tool.shpersons.dat아래와 같이 인사 데이터가 포함된 파일인 내 프로그램입니다 .

3601|Wang|Lin|male|1981-01-02|2010-03-14T19:06:18.373+0000|1.10.108.68|Firefox

id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed

ID가 두 글자 플래그이고 수동으로 전달할 수 있기 때문에 getopts를 사용할 수 없다는 것을 알고 있지만 위치를 고려하지 말라는 메시지가 표시됩니다.

./tool.sh -f persons.dat -id <id> 

그리고:

./tool.sh -id <id> -f persons.dat

같은 용도로 사용해야 합니다

어떤 아이디어가 있나요?

답변1

귀하의 질문이 이 두 가지 옵션으로 제한되는 경우 다음과 같습니다.

usage() {
echo "tools.sh -id <id> -f <file>"
echo "note: order of options is not important"

}

if [ $# -ne 4 ]; then
    echo "Wrong number of arguments"
    usage   
    exit 1
fi

if [ "$1" = "-f" -a "$3" = "-id" ]; then
    file="$2"
    id="$4"
elif [ "$1" = "-id" -a "$3" = "-f" ]
then
    file="$4"
    id="$2"
else
    echo "Wrong syntax!"
    usage
    exit 1
fi

그런 다음 awk를 사용하여 파일을 구문 분석할 수 있습니다.

awk -F'|' -v id="$id" '$1==id{printf "ID: "$1"\nUser: "$2" "$3"\nGender: "$4"\nBorn: "$5"\nCreation Date: "$6"\nLocation IP: "$7"\nBrowser used: "$8"\n"}' $file

if [ $? -eq 0 ]
then
    exit 0
else
    echo "Something went \"woopsie!\""
    exit 1
fi

더 나은 결과를 얻으려면 이것이 숫자이고 실제로 파일 어딘가에 있는지 확인할 수도 있습니다 id.persons.datPATH

답변2

awk -F\| 'NR==1{
for(j=1;j<=NF;j++)
Arr[j]=$j;
next
}
{
printf("./tool.sh -f file --edit");
for(i=1;i<=NF;i++)
printf("%s %s ",Arr[i],$i)
}
{
printf("\n")
}' persons.dat

관련 정보