スクリプトを介してファイルを開こうとしています。ファイルを最初の引数として渡す限り、問題はありません。
$ 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
ファイル名を含めます。