• ベストアンサー

シェルスクリプトの変数の制限?

tsuduki999の回答

回答No.3

んー。fooの出力結果をbz2で保存したいというのが目的でよいのかな? Solaris は、時々コマンドが微妙に違っていたりするのであまり自信ないですけど シェルでは、基本的にクォーティングする癖をつけた方がよいですよ。 #!/usr/bin/sh var="$(foo)" if [ $? -eq 0 ]; then mv xxx.bz2 xxx.old.bz2 echo "$var" | bzip2 -zc >xxx.bz2 || echo error fi としてみたら、どんなです? もしうまくいったとしたら、$varに0x0dが混ざっていたのでしょう。

titokani
質問者

お礼

お返事ありがとうございます。 テストコードを書いてみました。 $ cat test.sh #!/usr/bin/sh var0="\0015" var=12345${var0}A echo $var echo "$var" $ test.sh A2345 A2345 と、なりましたので、どうやら改行が原因ではないようです。 他、 var0="\0042" としても試してみましたが、結果、 12345"A 12345"A と、なりましたので、バイナリであることはおそらく問題がないのかなと思います。 いずれにせよ、あまり大きなデータを変数に入れるのは問題があるようなので、変数に入れない方向で考えてみます。

関連するQ&A

  • シェルスクリプトの[-z "${変数名:-}"]の意味について

    Linuxでシェルスクリプトをみていると以下のように if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] -z "${変数名:-}"という記載をみかけます。 シェルスクリプトの該当箇所を読んだのですがわかりませんでした。 -zは分かるのですが。 よければ教えてください。

  • シェルスクリプトのコマンド グループ化における変数の有効範囲について教

    シェルスクリプトのコマンド グループ化における変数の有効範囲について教えてください。 中括弧"{ }"を使うと親プロセス(=その実行中のプロセス)にて実行、 小括弧"( )"を使うとサブシェル(=子プロセス)にて実行されると認識しています。 また環境変数は子プロセスに引き継がれ、シェル変数は引き継がれないと認識しています。 以下のシェルスクリプト(Bシェル)でテストしたところ、続くような結果となりました。 ~スクリプト内容~ #!/bin/sh ##TEST1 VAR01=AAA { echo 中括弧内でVAR01は${VAR01}; } ( echo 小括弧内でVAR01は${VAR01}; ) ##TEST2 { VAR02=BBB; echo 中括弧内でVAR02は${VAR02}; } echo 外でVAR02は${VAR02} ##TEST3 ( VAR03=CCC; echo 小括弧内でVAR03は${VAR03}; ) echo 外でVAR03は${VAR03} ~実行結果~ 中括弧内でVAR01はAAA 小括弧内でVAR01はAAA 中括弧内でVAR02はBBB 外でVAR02はBBB 小括弧内でVAR03はCCC 外でVAR03は  VAR02、VAR03の結果は納得できます。 またVAR01が{ }に引き継がれているのも納得できました。 しかし、VAR01はシェル変数として作成した(exportによる環境変数化はしていない)にも関わらず、子プロセスである( )内処理にも引き継がれているのはなぜなのでしょうか? 

  • シェルスクリプトについて教えてください

    以下のようなフォルダ構成があります。 /var/tmp/組織コード/log このlogディレクトリ配下に0byteのファイルがたくさんあり、それを全て定期的に削除したいと思っています。 また、同ディレクトリにはそれ以外のファイルやフォルダも入っていて、それらは絶対に削除してはいけないものです。 以下のようなコマンドを考えたのですが、なにか懸念される点はあるでしょうか? find /var/tmp/*/log -size 0c -exec rm {} \; いろいろ調べたのですが、Linux系は初心者のため、これで妥当かどうか不安なのです。 環境はSolaris11で、bashです。 「組織コード」の部分を固定値にしてコード数分コマンドを書けば確実だとは思いますが、組織コードが増えたり変わるたびにシェルにもメンテが必要になるので、イマイチだと思っています。 詳しい方、ぜひアドバイスしていただけないでしょうか。 よろしくお願いします。

  • Solaris7のCシェル文字数制限について

    Solaris7でCシェルスクリプトを使っています。 lsで拾ったファイル名をforeach文でまわしてみたのですが 文字数(ファイル数?)の制限に引っかかってしまいうまく回りません。 そこで質問なのですが、 Solaris7のCシェルforeach文で回せる文字数の限度をご存知の方いらっしゃいましたらご教授下さい。 宜しくお願い致します。

  • csh (tcsh)での環境変数の長さの制限について教えて下さい。

    Solaris8 (SPARC)上でJavaでいろいろ開発をしているのですが、 シェルの環境変数の長さに制限があるようで困っています。 具体的には、あちこちに散在しているjarファイルを参照する必要 があるので、環境変数 $CLASSPATHが非常に長くなっていて、 現在の設定以上に CLASSPATHを追加しようとすると「Word too long」 というエラーが出て設定できません。 1つの環境変数の長さの制限を変更することは可能でしょうか? もしくはなにか回避策があれば教えて下さい。 使用しているシェルは tcsh です。

  • シェルスクリプトでsyslogを別ファイルに追記

    Linuxとシェルスクリプトの超初心者です。 よろしくお願いします! 下記のようなシェルスクリプトを作りたいのですが、アドバイスをよろしくお願いします。 例) (1)/var/log/messagesを/tmp/syslogAllとしてコピーする (2)一日一度のcronで、messagesの新しいログ部分のみをsyslogAllに追記していく。 (1)部分は問題ないのですが、(2)の「messagsの新しいログ部分のみをsyslogAllに追記していく」方法のアドバイスをよろしくお願いします。 一応、自分なり以下の通り考えたのですが、普通じゃなさそうなので・・・(^^; ※syslogAllの最後の行(keyword)を取得し、messagesをgrepした後リダイレクトで追記していく。 grep -A 10000 keyword /var/log/messages | grep -v keyword >> /tmp/syslogAll どうぞ、よろしくお願いいたします!

  • Cシェルスクリプトで二重引用符をechoする

    Cシェルスクリプトで二重引用符をecho するにはどうしたらよいのでしょうか(できるのでしょうか)? エスケープ 「 \" 」のようなエスケープではダメでした。 変数展開をしたいので、一重引用符「'」で括るのではない方法が好都合です。 「VAR is "okwave"」 という出力を得るための同等のスクリプト例(冗長?): #! /bin/csh -f set VAR = "okwave" echo -n "VAR is " echo -n '"' echo -n "$VAR" echo '"' 宜しくお願い致します。

  • 変数名をプログラム中で作成して値を取り出す方法

    perlで変数名をプログラム中で作成して、その変数の値へアクセスする方法は、どのようにしたらよいのでしょうか? 例えば以下のスクリプトで、var_valueという変数名をプログラムで生成し、その値「12345」を取り出したい、というものです。 ================================ #! /usr/bin/perl $var_value ="12345"; $tmp1 = "var"; $tmp2 = "value"; $tmp3 = $tmp1."_".$tmp2; # $tmp3にvar_valueという文字列を作成              # print "tmp3 is $tmp3";  # 本当は$tmp3自体ではなく、$var_value=12345を取り出したい。。。 ================================ 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 配列の値を可変変数を用いて取得する方法について

    配列の値を可変変数を用いて取得する方法について 下記のようなソースがあるのですが、$tmp1_1zのような変数の場合、可変変数を用い取得する事は出来たのですが、$hairetsu["tmp2_1z"]のような配列の場合、可変変数を用い取得する事は出来ませんでした。 どちらの例の場合も、$varの中には意図した文字が取得できていると思うのですが、$$varの結果が異なり、どのように記述すれば配列の場合も可変変数の値が取得できるか分からなかった為、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 【ソース】 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>title</title> </head> <body> <?php $tmp1_1z = 1; $hairetsu["tmp2_1z"] = 2; $i = 1; $var = 'tmp1_' . $i . 'z'; echo "<p>var=" . $var . "</p>"; echo $tmp1_1z; // 下記は値が取得できます。 echo "<p>\$var=" . $$var . "</p>"; $var = 'hairetsu["tmp2_' . $i . 'z"]'; echo "<p>var=" . $var . "</p>"; echo $hairetsu["tmp2_1z"]; // 下記は値が取得できません。 echo "<p>\$var=" . $$var . "</p>"; ?> </body> </html> 以上、よろしくお願いします。

    • ベストアンサー
    • PHP
  • ダウンロードするシェルスクリプトについて

    LINUXサーバAとBの2つあります Linux-Aでは/aaa/bbbの中に(bak-A-20120218tar.bz)と(bak-B-20120218.gz)と毎日バックアップファイルを作成しています Linux-Aの容量が多くなっては困るのでLinux-Bのサーバから (1)毎日、定時にLinux-Aにアクセスし、 (2)Linux-Aの(bak-A-20120218tar.bz)と(bak-B-20120218.gz)をLinux-Bにダウンロードしたあと (3)Linux-Aの(bak-A-20120218tar.bz)と(bak-B-20120218.gz)を消去する このプロセスをシェルスクリプトに記載してCron登録したいと思っています そこでそのスクリプトを次のように考えました ************シェルスクリプト********************************* open xxx.yyy.ne.jp ・・・Linux-Aのサーバへ接続 user mmmmm nnnnnnn ・・・Linux-Aのサーバへ接続 cd /aaa/bbb/ ・・・Linux-Aの該当フォルダに切り替え binary mget bak-*.* ・・・bak以下のワイルドカードを利用して抽出(?) mdelete bak-*.* ・・・bak以下のワイルドカードを利用して削除(?) bye *************************************************************** 上記の5-6行目のように、ワイルドカードを指定して、ダウンロードとかファイル の消去をしようとしたのですがうまくいきません ワイルドカードを利用したのはbak-以下が毎日変わるのでそれを指定(プログラム)するのが難しかったのでこれを考えました まず、mgetとかmdeleteは利用できないのでしょうか このワイルドカードが利用できるダウンロードなり消去できるコマンド等あれば 教えていたただけないでしょうか または、別のいい方法があれば教えていただければ幸いです