인수로 전달된 파일을 열 때 옵션을 처리하는 방법은 무엇입니까? [폐쇄]

인수로 전달된 파일을 열 때 옵션을 처리하는 방법은 무엇입니까? [폐쇄]

스크립트를 통해 파일을 열려고 합니다. 파일을 첫 번째 인수로 전달하는 한 문제가 없습니다.

$ cat textExample.txt 
Much I marvelled this ungainly fowl to hear discourse so plainly,
Though its answer little meaning- little relevancy bore;
For we cannot help agreeing that no living human being
Ever yet was blessed with seeing bird above his chamber door-
Bird or beast upon the sculptured bust above his chamber door,
With such name as "Nevermore."
$ ./tester.sh textExample.txt 
BEGIN PROGRAM
parse file
For we cannot help agreeing that no living human being

그 중 tester.sh는 다음과 같이 작성되어 있습니다.

#!/bin/bash

# options
optstring=fh
Feature=0
Help=0
while getopts $optstring opt
do
  case $opt in
    f) Feature=1;;
    h) Help=1 ;;
    *) echo WRONG && exit 1 ;;
  esac
done

if [[ $Feature == 1 ]] ; then
    echo "This is a feature of the program"
elif [[ $Help == 1 ]] ; then
    echo "This is the help page"
fi

echo "BEGIN PROGRAM"
# assign file name
file=$1
echo "parse file"
grep 'cannot help' $file

exit 0

종료 문으로 인해 -h 플래그만 유효합니다.

$ ./tester.sh -h
This is the help page
$ ./tester.sh -f
This is a feature of the program
BEGIN PROGRAM
parse file
grep: option requires an argument -- 'f'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

따라서 매개변수가 플래그인지 확인하는 단계를 도입하도록 스크립트를 수정했습니다.

#!/bin/bash

# options
optstring=fh
Feature=0
Help=0
while getopts $optstring opt
do
  case $opt in
    f) Feature=1;;
    h) Help=1 ;;
    n) Custom_name=$OPTARG ;;
    *) echo WRONG && exit 1 ;;
  esac
done

if [[ $Feature == 1 ]] ; then
    echo "This is a feature of the program"
elif [[ $Help == 1 ]] ; then
    echo "This is the help page"
    exit
fi

for i in $@ ; do
    if [[ "${i}" =~ "-" ]] ; then
        true
    else
        input=$i
    fi
done


echo "BEGIN PROGRAM"
# assign file name
echo "parse file"
grep 'cannot help' $input

exit 0

결과 :

$ ./tester.sh -f
This is a feature of the program
BEGIN PROGRAM
parse file
$ ./tester.sh -f textExample.txt 
This is a feature of the program
BEGIN PROGRAM
parse file
For we cannot help agreeing that no living human being

문제는 선택한 이름의 파일에 행을 저장하기 위해 다른 매개변수를 추가하면 또 다른 문제가 발생한다는 것입니다. 수정된 파일에서:

#!/bin/bash

# options
optstring=fhn:
Feature=0
Help=0
output=
while getopts $optstring opt
do
  case $opt in
    f) Feature=1;;
    h) Help=1 ;;
    n) output=$OPTARG ;;
    *) echo WRONG && exit 1 ;;
  esac
done

if [[ $Feature == 1 ]] ; then
    echo "This is a feature of the program"
elif [[ $Help == 1 ]] ; then
    echo "This is the help page"
    exit
fi

for i in $@ ; do
    if [[ "${i}" =~ "-" ]] ; then
        true
    else
        input=$i
    fi
done


echo "BEGIN PROGRAM"
# assign file name
echo "parse file"
if [[ -z $output ]] ; then
    grep 'cannot help' $input
else
    grep 'cannot help' $input > $output
fi

exit 0

출력은 다음과 같습니다

$ ./tester.sh -f textExample.txt 
This is a feature of the program
BEGIN PROGRAM
parse file
For we cannot help agreeing that no living human being
$ ./tester.sh -f -n my_file textExample.txt 
This is a feature of the program
BEGIN PROGRAM
parse file
$ ./tester.sh -n my_file textExample.txt 
BEGIN PROGRAM
parse file

즉, 더 이상 입력 파일이 없으며 bash는 my_file 매개변수를 입력 파일로 사용합니다.

출력 파일을 작은따옴표나 큰따옴표로 묶고 존재하는지 확인하려고 생각했지만 따옴표를 벗어날 수 없어 오류가 발생했습니다. 수정된 부분:

for i in $@ ; do
    if [[ "${i}" =~ "-" ]] ; then
        true
    elif [[ "${i}" =~ \' ]] ; then
        true
    else
        input=$i
    fi
done

나는 얻다:

$ ./tester.sh -n 'my_file' textExample.txt 
BEGIN PROGRAM
parse file

즉, bash는 인수의 따옴표를 인식하지 못합니다. "\'", "\" 등과 $i, "$i"와 같은 다양한 옵션을 시도했습니다.

매개변수에 따옴표가 있는지 확인하는 방법이 있나요? 아니면 인수를 처리하는 더 좋은 방법이 있습니까?

답변1

처리 옵션을 사용한 후 getopts변수는 OPTIND다음으로 설정됩니다.색인옵션이 아닌 첫 번째 인수는 다음과 같습니다.

while getopts $optstring opt; do
    #... 
done
# now, remove the options from the positional parameters
shift $((OPTIND-1))

이제 $1파일 이름을 포함하십시오.

관련 정보