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

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

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

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

Q&A

解決済

5回答

159閲覧

【Linux】$$変数 と記述すると、位置パラメータではなくプロセスIDがかえってきてしまう

matera

総合スコア7

Linux

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

0グッド

0クリップ

投稿2017/06/20 06:23

編集2017/06/20 06:27

###前提・実現したいこと

1から9までの位置パラメータをfor文で作りたいのですが、
「 $$i 」の部分がプロセスIDを取得する命令になってしまいます。

どなたか、知恵をお貸しください。

理想の実行結果
引数 a b c
$1 = a
$2 = b
$3 = c
$4 =
$5 =
$6 =
$7 =
$8 =
$9 =

###発生している問題・エラーメッセージ

現在の実行結果
引数 a b c
$1 = 5772i
$2 = 5772i
$3 = 5772i
$4 = 5772i
$5 = 5772i
$6 = 5772i
$7 = 5772i
$8 = 5772i
$9 = 5772i

###該当のソースコード ```【Linux/CentOS/vim】 for i in $(seq 1 9) do echo "\$$i = $$i" done

###試したこと

${$i} と、カッコやクォーテーションで囲ってみましたが、変わりませんでした。

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

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

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

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

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

guest

回答5

0

表示だけなら

bash

1#!/bin/sh 2set a b c 3for i in $(seq 1 9) 4do 5 echo -n $ 6 eval echo "${i} = \$${i}" 7done

投稿2017/06/20 07:10

編集2017/06/20 07:15
A.Ichi

総合スコア4070

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

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

matera

2017/06/20 07:23

回答ありがとうございます! 引数はとっていませんが、何かに応用できそうです!
A.Ichi

2017/06/20 07:42

引数を外から渡さなくてもsetでargに入れる事が出来るのでテストに便利です
matera

2017/06/20 09:01

なるほど! それと、これは普通に引数を使うやり方としてもシンプルですね! 自分の頭でもわかりやすかったです!
guest

0

Bash

1for i in $(seq 1 9) 2do 3 4eval echo "\\\$$i = \$$i" 5 6done

mattnさんの回答のように一旦配列変数に入れた方が、わかりやすいでしょう。
evalを使っても出来ますが、\を何個書けばいいのかを考えるのが面倒です。

なお、単に引数を順番にループして処理したい場合は、普通はこう書きます。

Bash

1for arg 2do 3 4echo $arg 5 6done

添え字も同時に必要なら、これじゃ駄目ですが(もしくは別途カウントアップするか)。

投稿2017/06/20 07:09

otn

総合スコア84507

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

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

matera

2017/06/20 07:18

回答ありがとうございます! 当方初心者なので、「普通」を教えていただけるのが一番ありがたいです。 実行結果も確認できました!
guest

0

単にすべてのパラメータをとるなら、こんなのもありです。

bash

1#/bin/sh 2i=1 3for param in $@ 4do 5 echo "${i} ${param}" 6 i=`expr $i + 1` 7done

投稿2017/06/20 06:55

tacsheaven

総合スコア13703

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

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

matera

2017/06/20 07:07

回答ありがとうございます! このような方法もあるのですね、スマートです!
guest

0

ベストアンサー

添え字でアクセス出来ます。

bash

1args=("$@") 2for i in $(seq 1 9) 3do 4 echo "\$$i = ${args[$i-1]}" 5done

投稿2017/06/20 06:37

mattn

総合スコア5030

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

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

matera

2017/06/20 06:51

すみません、こちら確認できていませんでした! こちらも試してみます。
matera

2017/06/20 06:57

目的の実行結果になりました! ありがとうございます! 添え字というものを知らなかったので、これから調べてみます。
matera

2017/06/20 07:16

ああ、添え字ってそういうことですか! 勘違いしていました、すみません。 しかし、このやり方は知りませんでした。
guest

0

以下でどうですか?

sh

1for i in `seq 1 9` 2do 3 4 echo "\$i = $i" 5 6done

投稿2017/06/20 06:28

moonphase

総合スコア6621

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

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

matera

2017/06/20 06:35

回答ありがとうございます。 さっそく実行してみたところ、 引数 a b c $i = 1 $i = 2 $i = 3 ...(以下省略) という実行結果になってしまい、目的の結果が得られませんでした。 当方は位置パラメータを作りたく、内部的には echo "\$1 = $1" echo "\$2 = $2" ...(以下省略) のように動いてほしいのです。
matera

2017/06/20 06:36

あ!すみません、記述間違えていたかもしれません。 少し待ってください…
moonphase

2017/06/20 06:41

あ、そういうことですね。 以下でできました。 for i in `seq 1 9` do /bin/echo -n "\$$i = " eval echo '$'$i done
matera

2017/06/20 06:41

`seq 1 9 `の場合だとやはり $i = 1 $i = 2 $i = 3 となり、一応 ’seq 1 9’ も試しましたが、 $i = seq 1 9 という結果になりました。
matera

2017/06/20 06:42

ああ、すみません、更新していませんでした!
matera

2017/06/20 06:50

おおー… 無事期待通りの結果を得られました! ありがとうございます! 当方Linux初心者で、ここまで手間がかかると思いませんでした。 bin下のechoに、別個で直接投げているのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問