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

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

ただいまの
回答率

90.52%

  • Linux

    4365questions

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

for文で使われる#の意味について

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 557

muni

score 8

前提・実現したいこと

特に問題でもエラーでもなく急いでもいません。お時間のあるときにご教示いただきたく。
以下のようにfor文で#を使っているコマンドを教えてもらったのですが、#の意味が知りたいです。

for i in /hoge/hoge/[0-9]*
do
  echo -n "ID ${i#/*/}: $(cat $i/hoge)"
  egrep "^[0-9a-f]|^hoge:|^hoge:|^hoge:" $i/hoge
done

該当のソースコード

echo -n "ID ${i#/*/}: $(cat $i/hoge)" の行の#です。

試したこと

コマンドは正常に実行されることを確認した。

補足情報(言語/FW/ツール等のバージョンなど)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+3

man bashより:

${parameter#word}
${parameter##word}
パターンに前方一致した部分を取り除く。 word が展開され、パス名展
開 の場合と同じようなパターンを作ります。 このパターンが parame-
ter の値の先頭部分とマッチする場合、展開して得られる値は parame-
ter を展開した値から最短一致パターン (“#”の場合)  または最長一致
パターン (“##” の場合)  を取り除いたものになります 。  

この場合は、変数の値の冒頭の/とそのあとの何らかの文字列とその次の/が削除されます。#が1つなので*は最短一致となり、つまり「先頭の/から次の/までを削除」ということです。

もし#が2つ書いてあると最長一致になるので「先頭の/から最後の`/までを削除」です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/24 13:51

    もう回答がついてて驚きました。ご回答ありがとうございます。今回の例がわかりやすいです。ググってもわからなかったのでご質問した次第です。私もマニュアル見る癖をつけるようにします。

    キャンセル

+3

シェル変数で、展開する際にシェル内部で文字列置換をする事ができる機能です。

${HOGE#パターン} → 前方一致でのマッチ部分削除(最短マッチ)
${HOGE##パターン} → 前方一致でのマッチ部分削除(最長マッチ)
${HOGE%パターン} → 後方一致でのマッチ部分削除(最短マッチ)
${HOGE%%パターン} → 後方一致でのマッチ部分削除(最長マッチ)

HOGE=/home/user/hoge
-- 最短除外
echo ${HOGE#/*/}
-> user/hoge

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/24 13:53

    ご回答誠にありがとうございます!#が前方一致で%が後方一致ですね。%もこれで覚えることができました(^^)

    キャンセル

+2

bash だとして、これは for文に限った記述ではありません。
この記述は(以下、bash manページ日本語版より引用)

${parameter#word}
${parameter##word}
パターンに前方一致した部分を取り除く。 word が展開され、パス名展開の場合と同じようなパターンを作ります。 このパターンが parameter の値の先頭部分とマッチする場合、展開して得られる値は parameter を展開した値から最短一致パターン (#''の場合) または最長一致パターン (##'' の場合) を取り除いたものになります。 parameter が @ または * である場合、 パターンを削除する操作は全ての位置パラメータに順番に適用され、 展開結果はリストとして得られます。 parameter が @ または * が添字になっている配列変数である場合、 パターンを削除する操作は配列の全ての要素に順番に適用され、 展開結果はリストとして得られます。 

ですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/24 13:55

    ご回答誠にありがとうございます。for文に限らずですね。よくわかってなかったのですが、これで覚えました!私もマニュアルを見るようにします。

    キャンセル

同じタグがついた質問を見る

  • Linux

    4365questions

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