
下記のシェル関数 arg_space() 内で、grepを使いたいのですが。
'aaa bbb' などのスペースを含む文字列を引数として渡すとスペース後の文字列がファイル名と
認識されてしまいます。
-- arg_space.sh --
#!/bin/bash
CHK_STR='aaa bbb'
FILE_NAME='data/aaa.txt'
function arg_space() {
return `grep -c $1 $2`
}
arg_space $CHK_STR $FILE_NAME
if [ $? -ge 1 ];
then
echo 'Match !!'
else
echo 'No match.'
fi
exit 0
------------------
]# ./arg_space.sh
grep: bbb: No such file or directory
Match !!
スペース文字を、grep に区切り文字として認識させないようにする
方法を教えて 頂けないでしょうか。
-- data/aaa.txt --
aaa bbb ccc ddd
---------------
No.1ベストアンサー
- 回答日時:
return `grep -c "$1" "$2"`
arg_space "$CHK_STR" "$FILE_NAME"
シェルでは、変数の展開をしてから、コマンドの実行となります。
arg_space $CHK_STR $FILE_NAME
は
arg_space aaa bbb data/aaa.txt
となり、この時点で
$1=aaa
$2=bbb
$3=data/aaa.txt
となっています。
この状態では、function arg_spaceで対策のしようがありません。
ここを解決しても、
grep -c $1 $2
が
grep -c aaa bbb data/aaa.txt
となり、やはりaaa bbb をまとめて扱いません。
引用符を付けることで、空白までまとめることができます。
あとは、ファイルが無い等でgrepが何も返さなかった場合、 return が引数無しで実行されます。
これが、 $? に適当な値が入ってしまう理由です。
grepがエラーの場合は0を返す、等の工夫が必要でしょう。
#!/bin/bash -x
と -x オプションを付けると、変数展開等の処理が済んだあとの、実際に実行しているコマンドが出力されます。
デバッグ時には活用しましょう。
実行例)
○もとのままの場合
+ CHK_STR='aaa bbb'
+ FILE_NAME=data/aaa.txt
+ arg_space aaa bbb data/aaa.txt ← ここで既にaaa bbb と分割されていることがわかる
++ grep -c aaa bbb ← $1がaaa,$2がbbbになっていて、ファイル名が使われていないがわかる
grep: bbb: No such file or directory
+ return ← grepでエラーになると、引数無しでreturn していることがわかる
+ '[' 2 -ge 1 ']' ←$? が 2 になってしまっていることがわかる。
+ echo 'Match !!'
Match !!
+ exit 0
○arg_space "$CHK_STR" "$FILE_NAME" だけ変更
+ CHK_STR='aaa bbb'
+ FILE_NAME=data/aaa.txt
+ arg_space 'aaa bbb' data/aaa.txt ← ''が付いていて、空白込みで1つになっていることがわかる
++ grep -c aaa bbb data/aaa.txt ← こちらは、''が無いのでaaaとbbbが分割されている
grep: bbb: No such file or directory
+ return data/aaa.txt:0 ← bbb, data/aaa.txtの2つのファイルが指定されたので、grepはファイル名付きで出力する。
./arg_space.sh: line 8: return: data/aaa.txt:0: numeric argument required ← returnは数値しか受けつけないのでエラーになる
+ '[' 255 -ge 1 ']' ← エラーになったので、$?が期待とは違う
+ echo 'Match !!'
Match !!
+ exit 0
○grepの方も対策した場合
+ CHK_STR='aaa bbb'
+ FILE_NAME=data/aaa.txt
+ arg_space 'aaa bbb' data/aaa.txt ← ''が付いていて、空白込みで1つになっていることがわかる
++ grep -c 'aaa bbb' data/aaa.txt ← ''が付いていて、空白込みで1つになっていることがわかる
+ return 0 ← 数値だけになった
+ '[' 0 -ge 1 ']'
+ echo 'No match.'
No match.
+ exit 0
丁寧に回答いただきまして大変勉強になります。
上記の方法で、解決しました。
デバッグの方法、これから活用していきたいと思います。
本当にありがとうございました。_( . . )_
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- UNIX・Linux bashでブランク(空白)を検索文字列として指定する方法 1 2022/04/13 22:29
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- Visual Basic(VBA) Excel VBAでAA(BBB) → BBB.AA に置換したい 2 2022/10/30 13:59
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- その他(プログラミング・Web制作) bashのgrepで複数の検索、かつスクリプト内で改行する方法を教えてください。 1 2022/10/06 20:09
- UNIX・Linux bashスクリプトのgrepで3XXの検索の仕方について 2 2022/09/06 21:35
- PHP コメント機能に返信欄を矢印で追加したい 1 2022/05/09 21:17
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- Visual Basic(VBA) 【VBA】特定の文字で改行(次の行)に行きたい。 3 2022/04/11 17:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
pip --versionがエラーになる
-
数学、プログラミング、物理、...
-
画像生成AIのプロンプトの作り...
-
pythonの実行に関する質問
-
初心者powershellのPS1ファイル...
-
OS入ってる機器のソフト・アプ...
-
pythonについて(初心者です)
-
Python... 環境設定 初心者です...
-
マイクロソフトがvbを捨てたの...
-
PythonのTkinter詳しい方へ。画...
-
パイソンのソースコードをChatG...
-
Python 3.12.2 か一番最新のパ...
-
CSVファイルの複数行削除
-
COPYコマンドで、最後に1文字...
-
以下の技能を無料で受講できる...
-
ネットワークフォルダの中身を...
-
VBAでパワーシェルを実行したい...
-
HTMLソースが表示のページのも...
-
uwscでPauseキーが押されたら、...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vba クリップボードクリアにつ...
-
趣味がプログラミングだと言っ...
-
pythonについて(初心者です)
-
プログラミング言語のバージョ...
-
AIがプログラムする時代のプロ...
-
MOVEコマンドでサブフォルダー...
-
画像生成AIのプロンプトの作り...
-
Google ColaboでGUI作成
-
VBAでパワーシェルを実行したい...
-
Python... 環境設定 初心者です...
-
COPYコマンドで、最後に1文字...
-
10進数から2進数に変換 例 185 ...
-
FILMORAを使っているのですがテ...
-
pythonでhtmlファイルの指定文...
-
HTMLソースが表示のページのも...
-
⚠️至急です!⚠️ Yahoo!知恵袋の...
-
Pythonでの文字列からfloatへの...
-
Webサイト内に埋め込んだmp4動...
-
テキストファイルの1行目のみを...
-
ネットワークフォルダの中身を...
おすすめ情報