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

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カーネル上に構築されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

1回答

479閲覧

Lunux Shell 変数への文字列の格納

Oramun

総合スコア76

bash

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

Linux

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2017/08/30 08:41

コマンド実行時のオプションの指定を変数に格納し、

Command $Option

の様に実行したいと思っています。

そこでヘルプで表示されたオプションをスクリプト内に全て記入し、
以下の様にコメントアウトを外したオプションのみ変数に格納したいのですが、そういった事が可能でしょうか?

-a # コマンド詳細 # -b # コマンド詳細 # -c # コマンド詳細 -d # コマンド詳細 # -e # コマンド詳細

上記のコマンドを Option という変数に格納できた場合に、
参照した時には以下の様に見えて欲しいです。

[hostname]# echo $Option -a -d

どなたかご教授ください。
宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こういうのはどうでしょう。

bash

1opts= 2while read line; do # ヒアドキュメントから一行ずつ変数 line に読み込み 3 if [ ${line:0:1} != "#" ] ; then # 先頭文字が "#" でない場合だけ 4 opt="${line%% *#*}" # 後ろのコメント行を外して 5 opts="${opts} ${opt}" # 変数 opts に追加していく 6 fi 7done <<EOS # ヒアドキュメントで記述 8 -a # Alice 9# -b # Bob 10 -c # Carol 11# -d # Dave 12 -e # Ellen 13EOS 14 15echo "$opts"

投稿2017/08/30 10:34

unau

総合スコア2468

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

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

Oramun

2017/08/31 01:16

回答ありがとうございます! 思い通りの回答が得られて、大変助かりました!
unau

2017/08/31 01:22

変数展開時における部分文字列の取得 (${line:0:1} の部分)、など、bash のバージョンによっては使えないものもあるかと思いますのでご注意ください。 あと、ヒアドキュメントのパージングをしているところは、ごくごく単純な方法ですので、ヒアドキュメントの書き方にだいぶ制限があります。ご自分なりにカスタマイズしてみてくださいませ。
Oramun

2017/08/31 01:32

unau さん 申し訳ありません、1つだけ追加で回答頂くことは可能でしょうか? コマンドのオプションを選択する際に、 -a # Alice # -b # Bob -c # Carol # -d # Dave -e eee # Ellen --f # Frank # -g # Glen -h=pattern # Harry の様な場合にも対応できればなと思っております。 --f, -h=pattern の様に文字列が続いてる場合には、想定した動作になりましたが、 -e eee の様な空白が挟むと -e しか表示されません。 お手数お掛けしますが、可能であれば回答宜しくお願い致します。
unau

2017/08/31 05:30

そのあたりが、まさに「ご自分なりにカスタマイズしてみてください」とあらかじめ言っておいたところです。ヒアドキュメントにどのように書きたいかによって、どのようにパースするのかが決まってきますので。 「ヒアドキュメント」およびそれを自分でパースしてオプションを組み立てる、という叩き台はありますので、私のスクリプトを完全に理解したうえで、ご自身で試してみるとよいと思います。
unau

2017/08/31 05:33

と、突き放すだけもアレなので。 元のスクリプトの opt="${line%% *#*}" の行を opt="${line% *#*}" に変更して試してみてください。 どうしてそのような動きになるか、もし望みの結果になったとしても、その場合、ヒアドキュメントに書く書式の制限にはどんなものがあるか (逆に言えば、どういう書き方をすると想定していない動きになってしまうのか)、ちゃんと考えてみてください。
Oramun

2017/08/31 05:51

unau さん 色々検証して、頂いたコードを理解するとこから始めます。 もうちょっと自分で考えて、それでも分からない場合に質問しようと思います。 回答どうも、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問