• ベストアンサー
  • すぐに回答を!

シェルスクリプト文字列の処理について

はじめましてよろしくお願いします。 質問サイトもシェルも初心者なので至らない点がございましたら ご容赦の程よろしくお願いします。 下記シェルスクリプトを実行すると下記エラーが発生します。 「test2」変数に空白無しで「abc」と入力するとエラーは発生しません。 変数test2の値(a bc)を変更せずにエラーが発生しない方法はないでしょうか? 手段でもかまいませんので教えてください。 ========================= testsh110207.sh ====================================== #!/bin/sh test1="abc" test2="a bc" if [ ${test1} = ${test2} ] then echo "=:文字列1と文字列2が等しい場合に真" echo "test1の「${test1}」と、test2の「${test2}」は等しい" fi if [ ${test1} != ${test2} ] then echo "!=:数値1と数値2が等しくない場合に真" echo "test1の「${test1}」と、test2の「${test2}」は等しくない" fi echo "********* テスト完了 *********" ======================================================================= $ ./testsh110207.sh ./testsh110207.sh: line 6: [: too many arguments ./testsh110207.sh: line 13: [: too many arguments ********* テスト完了 *********

共感・応援の気持ちを伝えよう!

  • Linux系OS
  • 回答数1
  • 閲覧数1448
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1
  • entree
  • ベストアンサー率55% (405/735)

if [ ${test1} = ${test2} ]   ↓ if [ "${test1}" = "${test2}" ] 値にスペースを含む変数を引数に渡すときはダブルクォーテーショ ンで括らないと展開されて複数の引数が渡されたという風にみなさ れてしまいます。 [ コマンドで比較する場合は第2引数に演算子、第4引数は] でな ければなりませんが(もちろん演算子によってルールは違います)、 変数が展開されてしまった結果、] が第5引数になってしまってお りエラーを吐いている状況です。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • シェルスクリプトエラーになります。

    はじめまして、初心者なので失礼な書き方でしたらご容赦願います。 下記のようなシェルスクリプトを書きました。 実行したところエラーになります。 何がいけなく、正しくはどう記述すればよろしいでしょうか? 何卒ご教授願します。 ===========================ここから=============================== #!/bin/sh test1=12345 test2=678 if ${test1} -eq ${test2} then echo "eq:数値1と数値2が等しい場合に真" echo "test1の「${test1}」と、test2の「${test2}」は等しい" fi if ${test1} -ne ${test2} then echo "en:数値1と数値2が等しくない場合に真" echo "test1の「${test1}」と、test2の「${test2}」は等しくない" fi echo "********* テスト完了 *********" ===========================ここまで============================== ======================実行結果エラーここから======================== $ ./testsh110204.sh ./testsh110204.sh: line 6: 12345: command not found ./testsh110204.sh: line 12: 12345: command not found ********* テスト完了 ********* ======================実行結果エラーここまで======================

  • ファイルから文字列を読み込むシェルスクリプトの作成

    現在シェルスクリプトの勉強をしています。 ファイルから文字列を読み込み表示するだけのシェルスクリプトを 作成しているのですが、エラーが出てうまくいきません。 ./test.sh: line 10: syntax error near unexpected token `done' 以下の通りファイルを作っています。 改行コードはLF、文字コードはSJISとなっています。 どのあたりが間違っているのか教えて頂けますでしょうか。 よろしくお願いします。 test.sh --------------------- #!/bin/sh LIST=./abc.lst while read F1 echo ${F2} break done < ${LIST} } --------------------- abc.lst --------------------- AAA BBB CCC ---------------------

  • シェルスクリプトにおけるreadコマンドについて

    シェルから読み込まれる"param_file"において、 A B といった途中に空白を含む行が存在する場合、 while read PARAM if [ $1 = ${PARAM} ] then break fi done < "param_file" を実行すると if文実行時に "too many arguments"エラーが発生します。 Solalis上で同じ処理を実行してもエラーが 発生ませんが、Linux特有なのでしょうか。

  • シェルスクリプトでのechoについて

    お世話になっております。 echo文を使用して変数内に格納された文字列をファイルに追記しようとするとエラーが発生します。 エラーが発生している構文: echo $add >> $file エラー内容: read.sh: line 89: /etc/ntp.conf: そのようなファイルやディレクトリはありません エラー発生時の変数の中身: $add → server 192.168.1.1 $file →/etc/ntp.conf 同シェルスクリプト内のほか箇所では、echo文を使用しての追記は正常に行えております。 また、/etc/ntp.confは存在しており、catコマンドで内容の出力ができることを確認できております。

  • シェルスクリプト(if文)

    bashにてシェルスクリプトを作成しています。 XXXX_111122222333_YYYYMMDD 111122222333 といった2パターンのファイル名から、「111122222333」の部分を取得したいのですが、if文の条件式で悩んでいます。 if [ expr length ${p9} -gt 13 ] then a=`echo $p9|cut -c 6-9` b=`echo $p9|cut -c 10-14` c=`echo $p9|cut -c 15-18` else a=`echo $p9|cut -c 1-4` b=`echo $p9|cut -c 5-9` c=`echo $p9|cut -c 10-13` fi これで実行すると too many arguments というエラーが出てしまいます。(結果も正しくありません) 基本的な部分が理解できていないかと思うのですが、宜しくお願いいたします。

  • シェルスクリプト ファイルの読み取りとgrepのし

    test.nicdfにはネットワークアドレスとマウントポイント(df)の情報が格納されてます。 行いたいこととしては、 test.nicdfファイルから一行づつ読み取り、 ネットワークアドレスとマウントポイントの2つの情報を読取ます。 マウントポイントは複数行あるため分り易いネットワークアドレスを grepで抽出して、他の行はマウントポイントとして認識させようと思いました。 =========================== $ cat test.nicdf 210.175.250.212 /dev/mapper/VolGroup00-LogVol00 /dev/hda1 tmpfs ========================== $ test.sh #!/bin/sh while read LINE; do echo $LINE if [ ${LINE} grep "192" ] then echo "network" else echo "NEXT" fi done < test.nicdf ========================== しかし下記のエラーが発生します。 grepの書き方が悪いようです。 このエラーを解決する方法をご教授願います。 また、ネットワークアドレスとマウントポイントの2つの変数に格納する方法も あわせてご教授頂けませんでしょうか? よろしくお願いします。 ========================= $ ./test.sh 192.168.0.250 ./testnakano.sh: line 6: [: grep: binary operator expected NEXT /dev/mapper/VolGroup00-LogVol00 ./testnakano.sh: line 6: [: grep: binary operator expected NEXT /dev/hda1 ./testnakano.sh: line 6: [: grep: binary operator expected NEXT tmpfs ./testnakano.sh: line 6: [: grep: binary operator expected NEXT =========================

  • シェルスクリプト 一つのふくすう変数から値を取る方

    いつもありがとうございます。 NICという変数にはネットワークアドレスが2つ入ってます。 NIC= 192.168.0.1 127.0.0.1 下記のスクリプトで上記2つのアドレスを取ろうと思ってます。 ==========test.sh================ while read LINE; do echo $LINE done < ${NIC} =============================== しかし下記のようなエラーになります。 変数の取り出し方が悪いのだと思います。 =============================== ./test.sh: 192.168.0.1 127.0.0.1: そのようなファイルやディレクトリはありません 恐れ入りますが正しいスクリプトをご教授くださいますようお願いします。

  • シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕

    シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕方が分かりません。 -------------------------------------------------- #!/bin/sh . GetYesNo.sh          #外部シェルスクリプトを読み込んで... GetYesNo $1           #このGetYesNoの戻り値は0か1を出力するようにする。 if[ ??? -eq 0 ]; then      #"???"の部分に何を入力すれば良いか分かりません。 echo "真(0)です。" else echo "偽(0以外)です。" fi -------------------------------------------------- 戻り値が0か1しか出力しない外部シェルスクリプトを読み込んで、その戻り値をtestコマンドを利用して、0か1のどちらかを判定して、それぞれの出力を出したいけれど、どうやって出来ますでしょうか。 色々な方法を試してみましたが、ダメでした。 上記のコードの書き間違いがあると思いますが、あったらご指摘をお願いします。

  • cygwinシェルスクリプト内でのエイリアス

    cygwinのterminal上で alias abc=ls abc とやるとlsを実行したことになるのですが、 内容が #!/bin/bash alias abc=ls abc のa.shというシェルを作り実行すると、 ./a.sh: line 3: abc: コマンドが見つかりません というエラーが出て実行してくれません。 解決策が分かる方よろしくお願いします。

  • シェルスクリプトのテスト

    年が変わるとシェルの処理も替わります。 例えば: year=`date +%Y` if [ $year=2006 ];then echo "year 2006" fi if [ $year=2007 ];then echo "year 2007" fi テストをしたいですが、 2007年のテストは出来ますでしょうか? 教えてください!お願いします。