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

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

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

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

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

3回答

1665閲覧

シェルスクリプトの変数の処理について

Naggy

総合スコア32

bash

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

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

0クリップ

投稿2016/08/30 20:50

###前提・実現したいこと
シェルスクリプトの作成をしているのですが、変数の処理で

${パラメータ#パターン} パラメータ前方から、パターンに最短一致した部分を除く
${パラメータ##パターン} パラメータ前方から、パターンに最長一致した部分を除く
${パラメータ%パターン} パラメータ後方から、パターンに最短一致した部分を除く
${パラメータ%%パターン} パラメータ後方から、パターンに最長一致した部分を除く

というのを試していますが、パターンの削除が反映されません。
これは対応してるbashとそうでないものがあるのでしょうか。

もし対応させる方法があるとしたら、手順などを教えていただけると幸いです。

###補足情報(言語/FW/ツール等のバージョンなど)
MacBook Air OS-X El Capitan
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15)
Copyright (C) 2007 Free Software Foundation, Inc.

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

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

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

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

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

otn

2016/08/30 22:51

どこかに間違いがありますので、コードと結果を書いてください
Naggy

2016/08/31 01:33 編集

すみません、takasima20さんの例文の通り、文字列だとうまくいくのですが、数字だとうまくいかないようです。 ソース: name=3.133543225432 ; fn=${name##\4} ; echo $name ; echo $fn ; 結果: 3.133543225432 ; 3.133543225432
guest

回答3

0

ベストアンサー

文字列だとうまくいくのですが、数字だとうまくいかないようです。 ソース: name=3.133543225432 ; fn=${name##\4} ; echo $name ; echo $fn ; 結果: 3.133543225432 ; 3.133543225432

数字だからじゃなくて、パターンにマッチしていないからです。
##は先頭からのマッチですよ。対象の先頭は 3 なのに、4 を指定しているのでマッチしません。
先頭で無く、途中の 4 を削除したいのなら、

Bash

1name=3.133543225432 2echo $name 3echo ${name/4/} 4echo ${name//4/}

です。

問題文を見直すと、

${パラメータ#パターン} パラメータ前方から、パターンに最短一致した部分を除く

${パラメータ##パターン} パラメータ前方から、パターンに最長一致した部分を除く
${パラメータ%パターン} パラメータ後方から、パターンに最短一致した部分を除く
${パラメータ%%パターン} パラメータ後方から、パターンに最長一致した部分を除く

と書いてありますが、曖昧ですね。正しくは、

${パラメータ#パターン} パラメータ先頭から、パターンに最短一致した部分を除く
${パラメータ##パターン} パラメータ先頭から、パターンに最長一致した部分を除く
${パラメータ%パターン} パラメータ末尾から、パターンに最短一致した部分を除く
${パラメータ%%パターン} パラメータ末尾から、パターンに最長一致した部分を除く

です。

投稿2016/08/31 05:14

otn

総合スコア84555

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

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

Naggy

2016/08/31 09:59

なるほど!!パターンについて解釈ができていませんでした! ついでに${パラメータ/pattern/}という表現も新たに覚えることができて嬉しいです。 ありがとうございました!
guest

0

ひょっとして

name=/var/log/boot.log fn=${name#*/} echo $name echo $fn

あとは、ケアレスミスが無いか見直すのかなあ

投稿2016/08/30 22:21

takasima20

総合スコア7458

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

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

0

http://dharry.hatenablog.com/entry/20090211/1234290856
こちらに詳しい解説が載っています。
特に変数パラメータ展開については

$ name=/var/log/boot.log $ echo ${name#*/} var/log/boot.log $ echo ${name##*/} #=> ファイル名を取得 boot.log $ echo ${name%*/} /var/log/boot.log $ echo ${name%/*} #=> ディレクトリ名を取得 /var/log $ echo ${name%%/*} $ echo ${name%.*} #=> 拡張子を削除 /var/log/boot $ echo ${name##*.} #=> 拡張子を取得 log $ echo ${name##/var/} #=> 先頭の/var/を削除 log/boot.log

がとても参考になります。
(/var/log/boot.logは実在のファイルではなく文字列変数です)
色々変えながらどうしたらどうなるかを研究してみてください。

それとは別にシェルスクリプトの書き方に関してですが、
上の例をシェルスクリプトにするとしたら、

  • varparam.sh

bash

1#!/bin/bash 2name=/var/log/boot.log 3echo ${name#*/} 4echo ${name##*/} 5echo ${name%*/} 6echo ${name%/*} 7echo ${name%%/*} 8echo ${name%.*} 9echo ${name##*.} 10echo ${name##/var/}

と言った感じのファイルを作ってください。
それだけだと実行できないので、
実行権限を与えてください。

$ chmod +x varparam.sh

で出来ます。
実行するには

$ ./varparam.sh

です。

投稿2016/08/30 21:46

taro_nii_chan

総合スコア207

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問