스크립트를 통해 파일을 열려고 합니다. 파일을 첫 번째 인수로 전달하는 한 문제가 없습니다.
$ 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
파일 이름을 포함하십시오.