shiro_usagi
@shiro_usagi (shiro usagi)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

PS1-やBASH-の「-」の意味が分かりません。(解決済)

質問

debian系の /etc/profile です。
PS1-やBASH-の「-」の意味が分かりません。
-が何をチェックしているのか分からないので教えて下さい。

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

if [ "${PS1-}" ]; then
  if [ "${BASH-}" ] && [ "$BASH" != "/bin/sh" ]; then
    # The file bash.bashrc already sets the default PS1.
    # PS1='\h:\w\$ '
    if [ -f /etc/bash.bashrc ]; then
      . /etc/bash.bashrc
    fi
  else
    if [ "`id -u`" -eq 0 ]; then
      PS1='# '
    else
      PS1='$ '
    fi
  fi
fi

if [ -d /etc/profile.d ]; then
  for i in /etc/profile.d/*.sh; do
    if [ -r $i ]; then
      . $i
    fi
  done
  unset i
fi

試したこと

~ $ echo $hoge
boke-value
~ $ echo ${hoge}
boke-value
~ $ echo ${hoge#baka-}
boke-value
~ $ echo ${hoge#boke-}
value
~ $ echo ${hoge#*-}
value
~ $ echo $BASH_VERSION
4.4.23(1)-release
~ $ echo ${BASH_VERSION-}
4.4.23(1)-release
~ $ echo ${BASH_VERSION}
4.4.23(1)-release

参考リンク

bashで変数から部分文字列を取得する - Qiita
https://qiita.com/koara-local/items/04d3efd1031ea62d8db5

【シェル芸人への道】Bashの変数展開と真摯に向き合う - Qiita
https://qiita.com/t_nakayama0714/items/80b4c94de43643f4be51

bash の初期化ファイル .profile, .bashrc, .bash_profile の使い分けと管理方針 - A Memorandum
https://blog1.mammb.com/entry/2019/12/01/090000

0

1Answer

${FOO-bar} と書くと変数 FOO が未定義のときだけ文字列 bar に展開されます。 ${FOO-} と書けば未定義のとき空文字列に展開するということです。

普段は ${FOO-}${FOO} と同じ挙動です。ただ、未定義の変数の展開でエラーを出すようにするシェルオプション -u がセットされているときだけ挙動が変わります。

bash-3.2$ unset FOO
bash-3.2$ echo "${FOO}"       # 普通は未定義の変数を展開すると空文字列になる

bash-3.2$ set -u              # -u をセットすると……
bash-3.2$ echo "${FOO}"       # 未定義の FOO を展開するとエラーになる
bash: FOO: unbound variable
bash-3.2$ echo "${FOO-}"      # 未定義のとき明示的に空文字列に展開させればエラーは出ない

bash-3.2$

つまり /etc/profile で ${PS1-} と書いているのは、 /etc/profile より前に読み込まれるファイルでシェルオプション -u がセットされたときもエラーにならないようにするためです。

2Like

Comments

  1. @shiro_usagi

    Questioner

    いつも有り難う御座います。
    よく理解出来ました。
  2. bashの変数展開の説明で${parameter:-word}の説明に同じことが書かれてあります。
    変数展開で${parameter:......}は${parameter......}と同じということでしょうか(コロンは不要?)。

  3. @piconao ${parameter:-word} は変数 parameter が未定義か空文字列のときに文字列 word に展開します。 ${parameter-word}parameter が未定義のときだけ word に展開します。つまり、細かい差ですが、変数が空文字列のとき挙動に違いが出ます。

Your answer might help someone💌