• 締切済み

Kシェルでの桁数取得

こんにちは、 昨日に続いてまたKシェルの質問です。 タイトルのとおりなのですが、 変数にはいっている文字列が、1文字か2文字か、という判定は可能でしょうか。 1文字の場合、頭に0を連結し、 2文字の場合はそのまま通すというものを作りたいのですが、参考になるものが探せませんでした。 (ex.変数に9が入っていたら、09、11ならそのまま) ご存知の方、いらっしゃいましたらご教授願います。 (参考にできそうな本を教えて頂いたのですが、近所にはなく注文するとすると時間がかかってしまうので…;;)

みんなの回答

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.4

こんにちは。コマンド置換は「$((...))」ではなくて「$(...)」 (括弧は1重)でした。申し訳ありません。 これは「`...`」に比べて入れ子で何重にも実行できる点が有利です。 (ちなみに、bash でも「`...`」は推奨されない表記法です) さて、ksh の機能だけを使ってご質問に真正面から取り組んでみます。 変数 var の文字数を調べ、1文字なら0パディングした結果を入れ直します。 case ${#var} in 1) var="0$var" ;; 2) ;; # 何もしない esac それでは。

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.3

こんばんは、satosaya さん。お礼どうもありがとうございました。 外部コマンドを使っていいのなら printf を使うのが 一番スマートだと思います。 ただそうなると欲が出てきて、AWK, Perl, Ruby などのスクリプト言語で いろいろやりたくなってくるのですが(^^; これは下の方々の回答の補足になりますが、ksh の機能だけを使って 変数 variable に格納された文字列の長さを知るには 「${#variable}」が使えます。ksh の機能を受け継いだ bash, zsh でも可能。 $ verylongword="floccinaucinihilipilification" $ print ${#verylongword} 29 $ nagaitango="日本語はどうかな?" $ print ${#nagaitango} 18 echo, `...` は ksh では「廃れた機能」として使わないほうがいいです。 それぞれ print, $((...)) を使ってください。 if, while などの条件では整数式を ((...)) で括って使ってください。 前回のご質問に関連して、任意の式を整数属性を持つ変数 intver に代入するには、「((intver=式))」あるいは「let intver=式」も使えます。 $ let day="09" $ print $day 9 $ let anotherday='1 + 14' $ print $anotherday 15 早く本が手元に届くといいですね。それでは。

  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.2

Kシェルとは直接関係ないですが、外部コマンドを使っていいなら、 今回は数値が相手のようですからprintfコマンドでどうでしょう。 a=9 b=`printf "%02d" $a` あたりで行けると思います。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

Kシェル自体に文字の長さを求める機能があるかどうかは判りませんが、以下の方法で取得が可能です。 --------------------------- moji="ABCDEFG" len=`expr $moji : '.*'` echo LEN=$len echo $moji ---------------------------- コピー&ペースト時は、全角スペースを半角に変えて下さい。 exprは:の両端の文字を比較し先頭から何文字が一致したかを返します。この場合、右側に.*(正規表現)を指定すると無条件に全て一致したことになり、結果的に左側の文字の桁数が返ります。$lenが求める結果です。

関連するQ&A

  • シェルの文字列取得について

    シェル(Bash)の文字列取得についてご教授ください。 文字列:  test(12345) 上記の文字列から"12345"(括弧内の数値部分)を取り出し、変数へ格納する場合、どのように行えばよいのでしょうか? ちなみに1桁だったり2けただったりと数値の桁は変動します。 よろしくお願いします。

  • 【シェル】case文でワイルドカードを使う

    変数varにtestで始まる文字列が格納されているかされていないかを判定し、 testで始まる文字列が格納されていない場合、ある処理をしたいです。 以下のようにすると、tまたはeまたはsまたはtで始まるかどうかを判定してしまいます。 case "$var" in [!test]* );; esac どのように書けばよいでしょうか? ヒントでも良いので教えてください。

  • Cシェルでの文字列大小比較

    Cシェルで set AA="aa" set BB="bb" if( $AA > $BB )then echo "$AA > $BB" endif というような判定がしたいのですが、 上記の場合、”if: 条件式構文が正しくありません”というエラーが出力されます。 Cシェルの場合、文字列の比較は ifでイコールかノットイコールかは判定できますが、文字コードの大小比較が出来ないようですが、 文字列の大小比較をするにはどうすればよいのしょうか

  • シェル(ksh)で変数にある文字列を取り出す

    お世話になります。 シェルで変数(例えば:OUT)に入っている文字列ついて2つ質問させてください。 1:変数に入っている文字列を後ろから何文字(固定長)取り出したい場合にどのようすればよいか教えてください。 試してみたのは以下です。 OUT1=abcde #変数OUT1に文字列abcdeを代入 OUT=${OUT1:3:(-1)} (固定長3バイト後ろから取り出したい(cde)) をファイルに書きこんで起動すると、上記の処理にいったところで、"置換が正しくありません"とでてしまいます。 2:変数に入っている文字列の文字数を取り出したい。 試してみたのは以下です。 OUT1=abcdec #変数OUT1に文字列abcdeを代入 OUT=${#OUT} これは、コマンドラインでecho ${#OUT}とすると6と文字数を表示してくれますが、ファイルに書きこんで起動すると上記同様"置換が正しくありません"と表示されてしまいます。 OSは、SUN OS 5.8です。 わかるかたがいらっしゃたら教えてください。 宜しくお願いします。

  • シェルで正規表現 YYYY/MM/DD

    引数で受け取った文字列が YYYY/MM/DD形式であるかを判定したいのですが、シェルが初めてなのでよくわかりません・・・。 どなたかご教授ください! よろしくお願いします。

  • [Kシェル] ファイル読み込み

    最近Kシェルを始めたばかりでつまづいています。 あるログファイルの行を取得して、 その行のn番目の値を合算したいです。 例:ログファイルの中身 1,1000,AAAA,10000, 2,1000,EEEE,1000, 3,1005,CCCC,1050, ※上記で4番目を合算する場合、  12050と出力したいです。 以前Cシェルを使用していたので、 foreachのような動きを考えていたのですが、 参考書を見ると効率的でない(readを使う) という記載がされています。 ログが数万行に達する可能性があるので、 効率的なやりかたを模索していますが、 何かよい方法がありますでしょうか。 よろしくお願いいたします。

  • シェル変数に2つのスペースを代入する方法

    シェルスクリプトを作成する際、変数に2つのスペースを持つ値を代入するにはどうすればいいのでしょうか。 例えば変数SPACEに「Jan△△1」という文字列を代入したい(△はスペース1文字分)時、 SPACE="Jan△△1" echo $SPACE   としても、 結果は「Jan△1」となってしまいます。 どなたかご存じの方、よろしくお願いします

  • UNIX(Bシェル)のプロンプトについて

    Bシェルのプロンプトの設定は環境変数PS1に変えたい文字列を入れればOKですが、現在自分のいるディレクトリ名を表示させたい場合はどのようにしたらいいでしょうか。 PS1="["`pwd`"]" などと設定してもディレクトリが変わったらその設定したときのディレクトリ名のままです。  また、ユーザ名も表示したいのですがsuコマンドでユーザ名を切り替えた場合プロンプトに表示させたユーザ名も変更させることはできるのでしょうか?

  • 正規表現による検索

    正規表現によって文字列を検索し、該当する文字列が存在する場合には存在する旨のメッセージを出力し、存在しない場合には存在しない旨のメッセージを出力するようなプログラムを作りたいのですが現在うまくいっておりません。ソースは以下になります。 #!/usr/bin/perl $logfile = './log_euc.log'; # ログファイル @logs = &read_file($logfile); foreach $log (@logs) { if ($log = ~/hogehoge/ ){ $log_stg = " 変数に文字列hogehogeは含まれています。 "; }else{ $log_stg = " 変数に文字列hogehogeは含まれていません。 "; } print " 判定結果\n "; print " $log_stg\n "; } sub read_file { local($logfile) = $_[0]; open(IN,$logfile); local(@files) = <IN>; close(IN); return @files; } 検索対象のファイル「log_euc.log」は以下です。 hogehoge mugemuge riri ari siri siursoiu sojowijugo hfsoiehrohogehoge sjhoisjofhoge osihojfhoge hsoghsoehogehogesoijggggg 検索結果は以下です。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。 判定結果 変数に文字列hogehogeは含まれています。

    • ベストアンサー
    • Perl
  • Kシェルでgotoのような処理を作成したい。

    Kシェルでgotoのような処理を作成したい。 以下のような処理で、入力した文字が条件と一致しなかった場合、 再度、入力からやり直させるようにしたいです。 以下が例です。 NGになった場合、再入力を促したいです。 #!/bin/ksh echo "Input Moji ---> \c" read ans_Moji if [ ${ans_Moji == "入力した文字" ] ; then echo "OK" else echo "NG"  fi Windowsのようにgoto文があれば、簡単に出来るのですが、 シェルをはじめたばっかりでよく分かっておりません。 何かご存知でしたら、ご教授願います。

専門家に質問してみよう