引数として渡されたファイルを開くときにオプションを処理する方法は? [閉鎖]

引数として渡されたファイルを開くときにオプションを処理する方法は? [閉鎖]

スクリプトを介してファイルを開こうとしています。ファイルを最初の引数として渡す限り、問題はありません。

$ 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ファイル名を含めます。

おすすめ記事