質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

解決済

1回答

4308閲覧

Linux Bash 配列の内容が初期化される

退会済みユーザー

退会済みユーザー

総合スコア0

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

0クリップ

投稿2017/04/08 06:34

編集2017/04/08 09:26

一つ一つ curl "http:// ~ : ポート番号 / ファイル ? function=xxx&name=XXX"と異なるファンクションで呼び出すのですが、一回一回ファンクションを呼び出す毎に、配列の内容が初期化されてしまいます。

配列内容が初期化されずに、保持する方法を教えてください。

Bash

1 2#!/bin/sh 3echo "Content-Type: text/plain" 4echo "" 5 6function add { 7 8 Name+=$1 9 Age+=$2 10 11} 12 13function delete { 14 15 Name=() 16 Age=() 17 18} 19 20 21function check { 22 23 for ((i = 0; i < ${#Name[@]}; i++)) { 24 if "${Name[$i]}" = ${name} ; then" 25 echo "`echo \"${Name[i]} : ${Age[i]} \"`" 26 fi 27 } 28 29} 30 31 32 XIFS="$IFS" 33 IFS="&" 34 set -- $QUERY_STRING 35 IFS="$XIFS" 36 37for arg 38do case "$arg" in 39 function=*) function=${arg#function=} ;; 40 name=*) name=${arg#name=} ;; 41 age=*) amount=${arg#age=} ;; 42 esac 43done 44echo "function: $function" 45echo "name: $name" 46echo "age: $age" 47 48 49 50case "$function" in 51 "add") 52 add $name $age;; 53 "deleteall") 54 deleteall;; 55 "check") 56 check $name;; 57esac 58 59

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2017/04/08 08:38

どういうコードを書いたのか、全くわかりません。実際のコードをご提示下さい。
KSwordOfHaste

2017/04/08 09:18

多分関数でcurlの結果をdeclare -a res=(......)などとして設定していて、このresが毎回上書きされるといった話ではないかと想像しましたが・・・
guest

回答1

0

ベストアンサー

シェル変数は、そのスクリプトの実行中のみ存在します。終了したら消えます。

スクリプトが終了しても値を保持したかったら、ファイルとかデータベースに書く必要があります。

プログラミング学習目的のようなので、ファイルに書くので良いかと思います。

簡単には、スクリプトの先頭で、
DATA=/tmp/hoge-hoge (書き込める適当なファイル名)
test -f $DATA && source $DATA
これで、読み出し。

スクリプト終了前に、
declare -p Name Age > $DATA
これで、保存。

#追記
データ保存出来ない以外は大体出来ているのかと思っていたら、色々間違いがあるので、間違いを直しました。
エラーチェックなど全然無いのはそのままです。また、コマンドインジェクション脆弱性もあります。

Bash

1#!/bin/bash 2echo "Content-Type: text/plain" 3echo "" 4 5DATA=/tmp/hoge-hoge 6if test -f $DATA 7then source $DATA #データファイルが存在すれば実行する 8else deleteall #データファイルが無ければ、初期化 9fi 10 11#データ追加 12function add { 13 Name+=("$1") 14 Age+=("$2") 15} 16 17#データ初期化 18function deleteall { 19 Name=() 20 Age=() 21} 22 23#データ検索 24function check { 25 for ((i = 0; i < ${#Name[@]}; i++)) { 26 if test "${Name[$i]}" = "$1" 27 then 28 echo "${Name[i]} : ${Age[i]}" 29 fi 30 } 31} 32 33#URL引数を変数にセット 34XIFS="$IFS" 35IFS="&" 36set -- $QUERY_STRING 37IFS="$XIFS" 38 39for arg 40do case "$arg" in 41 function=*) function=${arg#function=} ;; 42 name=*) name=${arg#name=} ;; 43 age=*) age=${arg#age=} ;; 44 esac 45done 46echo "function: $function" 47echo "name: $name" 48echo "age: $age" 49 50case "$function" in 51 "add") 52 add "$name" "$age" ;; 53 "deleteall") 54 deleteall;; 55 "check") 56 check "$name";; 57esac 58 59#データをコマンド形式で保存 60declare -p Name Age >$DATA

投稿2017/04/08 10:39

編集2017/04/08 12:26
otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/04/08 10:57

この文をそのまま利用するだけで、可能なのでしょうか。
otn

2017/04/08 11:07

CGIだと、HOMEはセットされませんね。修正しました。 サンプルでは、/tmp/hoge-hoge と書きましたが、そのファイルに保存されますので、消さないように。
退会済みユーザー

退会済みユーザー

2017/04/08 11:11

「test -f $DATA && source $DATA 」を実行する際、各変数にセットされるのでしょうか?
otn

2017/04/08 11:17

はい。 declare -p Name Age で、ファイルに保存した物を読み込みます。
退会済みユーザー

退会済みユーザー

2017/04/08 11:20

「declare -p Name Age < $DATA」 で読み込みできますか?
otn

2017/04/08 11:21

できません。何故そんな質問を?
退会済みユーザー

退会済みユーザー

2017/04/08 11:25

<と >が、読み込みと保存と誤った理解をしていました。
otn

2017/04/08 11:31

declare -p は指定した変数(複数可)を、「今の値で設定するシェルコマンド」を出力します。 出力されたシェルコマンドを > でファイルに保存して、そのコマンドを source で実行します。
退会済みユーザー

退会済みユーザー

2017/04/08 11:35

文を記載したのですが、保存も読み込みもされないです。
otn

2017/04/08 11:42

/tmp/hoge-hogeの内容は?
退会済みユーザー

退会済みユーザー

2017/04/08 11:45

何も記載されていないですね。
otn

2017/04/08 11:51

ああ、そもそも、Name と Age が初期化されてませんね。 「配列の内容が初期化される」と書いてあったので、初期化している物とばかり思い込んでいました。 書き直します。
退会済みユーザー

退会済みユーザー

2017/04/08 11:53

otn様、何度も申し訳ございません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問