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

bashで変数の文字列を編集するにはどうすれば良いですか?

bashで変数の文字列を編集するにはどうすれば良いですか? ■モジュール-Top #!/bin/bash declare Test1=2010-06-10 declare Test3=2010-03-01 declare Test2=/home/user/test.sh declare Test1x declare Test2x declare Test3x Test1x=[Test1から算出] Test2x=[Test2から算出] Test3x=[Test3から算出] echo 'Test1x='${Test1x} echo 'Test2x='${Test2x} echo 'Test3x='${Test3x} ■モジュール-Bottom ■実行結果 Test1x=201006 Test2x=2010-02-28 Test3x=test.sh この時、[Test1から算出]、[Test2から算出]、[Test3から算出]は、どのようになりますか?

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

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

  • ベストアンサー
  • 回答No.3
  • kmee
  • ベストアンサー率55% (1857/3366)

極端な話、bash以外のプログラムの助けを借りていいのなら、なんでもできます。 バッククオート``でコマンドを実行すればいいのですから。 Cなりなんなりで 指定日付の前日を表示するcalcDaysBeforeとかコマンドを作成して Test2='2010-03-01' Test2x=`calcDayBefere "${Test2}"` echo $Test2x とするとか。 GNUのdateだと、任意の日付を任意のフォーマットで出力できるので Test2='2010-03-01' Test2x=`date -d "${Test2} -1 days" +'%Y-%m-%d'` echo $Test2x とできます。他のdateコマンドでは使えません。

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

質問者からのお礼

>極端な話、bash以外のプログラムの助けを借りていいのなら、なんでもできます。 なるほど、つまりはこういう事ですか? 1.bashのプレーンな部分でできる事 2.linuxの環境を普通に作った範囲でbashから使用できる事 3.意図的に外部のアプリや開発アプリを組み込む事でできる事 を考えたとき、 1で出来ることは極限られているが、1~3で考えた時は、ほぼ何でもできる。 素人的には、1と2の境界線がよくわからないし、厳密に分かる必要もなく、 また、3は非常に敷居が高く、 1~2でできる事がbashでできる事という感覚です。 最初に紹介していただいたのが1~3でやる方法 後に紹介していただいたのが1~2でやる方法 でしょうか? 後者を試してみました。 うまく行きました。 これを元にTest1のパターンを試してみましたが、それもうまく行きました。 有り難うございます。 #!/bin/bash Test2='2010-03-01' Test2x=`date -d "${Test2} -1 days" +'%Y-%m-%d'` echo $Test2x Test1='2010-06-10' Test1x=`date -d "${Test1}" +'%Y%m'` echo $Test1x

その他の回答 (3)

  • 回答No.4
  • Tacosan
  • ベストアンサー率23% (3656/15482)

このくらいであれば「bash だけ」で終わらせることも可能です. 例えば 1: Test1x=${Test1%-*} Test1x=${Test1x/-} 3: Test3x=${Test3##*/} で (たぶん) 終わり. 2 もその気になればできるけど,努力と根性が必要なのでやろうとは思わない. フルパスからファイル名を除いた部分だけ欲しいなら ${foo%/*} が簡単. これだと最後のスラッシュが消えるので, 必要なら追加してやってください.

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

質問者からのお礼

なるほど、有り難うございます。

  • 回答No.2
  • Tacosan
  • ベストアンサー率23% (3656/15482)

どのような入力に対してどのような値を得たいのか, きちんと書いてもらえませんか? もちろん想像はできるにしても, その想像があなたの思っているものと一致するという保証はないですよね. あと, bash の他に使っていいコマンドは何があるんでしょうか? 「bash だけ」と限定すると cut や tr なども使えなくなりますよ. 余談だけど, Test2 と Test3 (あるいは Test2x と Test3x) は逆.

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

質問者からの補足

>どのような入力に対してどのような値を得たいのか, きちんと書いてもらえませんか? 後は、文字列'2010-03-01'より、前日を求め、同じフォーマットの文字列で返すというのが残っています。

  • 回答No.1
  • P-mann
  • ベストアンサー率62% (56/89)

Test2xはぱっと思いつかないけれど・・・。 Test1x=`echo ${Test1} | cut -d'-' -f1,2 | tr -d '-'` Test3x=`basename "${Test3}"`

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

質問者からのお礼

有り難うございます。 cutを使いこなせば、多くの言語にありがちなsubstrやspritのような事が出来そうですね。 trはreplace的な動きでしょうか。 basenameは便利なコマンドですね。 逆にpathだけ抜き出すコマンドは無いのでしょうか? 教えていただいたコマンドを調べました。 cutとbasenameは下記のサイトに載っていましたが、trは載っていませんでした。 http://www.k4.dion.ne.jp/~mms/unix/linux_com/index.html コマンドを網羅できているWEBサイトがあれば教えてください。

関連するQ&A

  • 変数の引き継ぎ(bash)

    bashで開発をしているのですが、 メインの変数より子シェルの変数に引き継ぎをしたいのですが、 どうすればいいのでしょうか。 test.sh #!/bin/bash # 外部変数 sub_test() { echo $1 } # メイン sub_test # test.sh AAA シェルを実行すると、AAAという文字が出てきません。 宜しくお願いします。

  • bashの関数の引数にスペースが入るとズレる件

    bashの関数の引数にスペースが入るとズレる件 bashの関数の引数にスペースが入ると、引数が分離して、位置がズレてしまいます。 これを回避する方法はありませんか? ■aaa.sh-Top #!/bin/bash declare FuncPara1 declare FuncPara2 function f_echo() { echo 'uf_echo1='$1 echo 'uf_echo2='$2 echo 'uf_echo3='$3 } echo '---test1---' FuncPara1='aaabbb' FuncPara2='ccc' f_echo ${FuncPara1} ${FuncPara2} echo '---test2---' FuncPara1='aaa bbb' FuncPara2='ccc' f_echo ${FuncPara1} ${FuncPara2} ■aaa.sh-Bottom ■aaa.shの実行 # ./aaa.sh ---test1--- uf_echo1=aaabbb uf_echo2=ccc uf_echo3= ---test2--- uf_echo1=aaa uf_echo2=bbb uf_echo3=ccc このtest2の時に、 ---test2--- uf_echo1=aaa bbb uf_echo2=ccc uf_echo3= となって欲しい。 もしくは、何かしら「なったテイ」で、 引数1の値は「aaa bbb」 引数2の値は「ccc」 と関数側で判断できる方法はありませんか?

  • bashでの変数の引渡し方法

    bashを使用するのが初めてなので教えてください。 shellscriptの中で変数を設定するのに共通変数設定用の子Shellを実行して変数を設定したいと思っていますが、うまく動きません。どのように設定したらいいのでしょうか。cshのときはsetenvでよかったのですが。。 親shell(hoge.sh) -------------- #!/bin/sh ./setenv.sh #変数設定用子Shell echo $USER exit 0 -------------- 子Shell(setenv.sh) -------------- #!/bin/sh USER="hoge" exit 0 -------------- 実行すると以下のようになります。 $./hoge.sh USER: not found

  • bashシェル: 引用符で囲まない文字列

    bashシェルにおいて、パスを表す文字列を引用符で囲まないで変数に代入すると絶対パスに展開されて代入されます。 引用符で囲んで代入すると展開されませんので、「パスを変数に代入する時は引用符で囲まない」と覚えておけばよいように思いますが、「引用符で囲まない文字列はパスを表す」ということなのでしょうか。 (引用符で囲んだ場合) $ DIR="~/" $ echo $DIR ~/ (次のようにしてもディレクトリ下のファイル名を得られない) for FILE in ${DIR}* ; do echo ${FILE}; done (引用符で囲まない場合) $ DIR=~/ $ echo $DIR /home/taro/ 2014年9月23日

  • 環境変数の設定(PATH)

    今、環境変数の設定(PATHの設定)を行っています。 OSは、RedHat9です。 スーパーユーザーのPATHは、 echo $PATHコマンドで見ると /usr/local/sbin:/usr/bin:/home/user1/test となっている。 しかし.bash_profileをみると PATHには、/usr/local/sbin:/usr/binしか 設定しておらず、 ユーザー(user1)の.bash_profileにも /home/user1/testをPATHに設定していない。 どこかでPATH設定を行っていると思いますが わかりません。 PATHの設定は、.bash_profileを設定するとは わかっているのですが、 スーパーユーザーの.bash_profileの記述と echo $PATHで見たPATHの構成がことなるのは なぜでしょうか? よろしくお願い致します。

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

    はじめましてよろしくお願いします。 質問サイトもシェルも初心者なので至らない点がございましたら ご容赦の程よろしくお願いします。 下記シェルスクリプトを実行すると下記エラーが発生します。 「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 ********* テスト完了 *********

  • bashシェルスクリプトで変数を使う

    bashシェルスクリプト内で変数を使いたいです。 Linux内の設定ファイルを参考に、 ・変数名=その内容、で設定 ・${変数名} 、で呼び出す だと判断し、以下のように使っています。 #!/bin/bash WORK=/home/aaa/ cd ${WORK} その後検索したところ、 「呼び出すには、$変数名 のように記述する」との説明を見かけ、 実際$の後に変数名を付けるだけでも認識したのですが、 { }は付けても付けなくてもよいのでしょうか。 { }が必要な場合もあるのでしょうか。

  • OS X bash実行ファイルからexport

    Mac OS X 10.6でbashシェルスクリプトに実行権限を与えて使います。 この中のexportが環境変数に反映されないのは何故でしょう? 以下実行ファイル(do.sh*)の中味です: #!/bin/sh KankyoHensu=Foo export KankyoHensu echo $KankyoHensu $source do.sh を行なうとちゃんとKankyoHensuが設定されますが、 $do.sh では設定されません。echoの方は予定通り動きます。 どなたか、よろしくお願い致します。

  • シェルスクリプトの1行目に#!を書いてもダメなのはなぜ?

    test.shというシェルスクリプトを #!/bin/bash echo "bash test" のように書き、chmod +x test.shを実行し、 test.shと入力すると、bash testが表示されるはずですが、 エラーbash: test.sh :command not found が出ます。which bashでパスを見ると /bin/bashなので、問題ないはずなんですが。 ちなみに、bash test.shと入力すると、正常に実行されます。 同様のことがperlスクリプト #!/usr/bin/perl print "perl test\n"; についても起こります。 何か設定がまずいのでしょうか? RedHatLinux7.2を使用しています。

  • bashで出力を変数に格納したい。

    初歩的な質問で申し訳ありません。 bashで、あるプログラムの出力の一部を変数に格納したいのですが、どのようにすればよいのでしょうか? 例えば、 >>./test.exe this is a pen. という実行ファイルがあるときに。 isのみを、変数 a に格納する。と言ったものです。 >>echo ${a} is