GNU/Linux >> Linux の 問題 >  >> Linux

Bash でパス変数の要素をループする

Bash のパターン置換パラメーター展開を使用して、ループ変数を設定できます。例:

MANPATH=/usr/lib:/usr/sfw/lib:/usr/info

# Replace colons with spaces to create list.
for path in ${MANPATH//:/ }; do
    echo "$path"
done

注:置換展開を引用符で囲まないでください。 MANPATH からの展開された値を、単一の文字列としてではなく、for ループによって個別の単語として解釈する必要があります。


内部フィールド区切り記号を設定できます:

( IFS=:
  for p in $MANPATH; do
      echo "$p"
  done
)

サブシェルを使用したため、IFS の変更が現在のシェルに反映されません。


Bash でこれを行う標準的な方法は、read を使用することです。 適切に組み込み:

IFS=: read -r -d '' -a path_array < <(printf '%s:\0' "$MANPATH")

これが唯一の堅牢な解決策です:まさにあなたが望むことを行います:文字列を区切り文字 : で分割します スペース、改行、および * のようなグロブ文字に関しては安全です 、 [ ] など (他の回答とは異なり:それらはすべて壊れています)。

このコマンドの後、配列 path_array が得られます 、ループできます:

for p in "${path_array[@]}"; do
    printf '%s\n' "$p"
done

Linux
  1. Bashシェルのカスタマイズ

  2. Bashスクリプト(I)

  3. 名前にスペースが含まれるファイルをループする??

  1. バッシュ‘?

  2. Bashの完了が代替案を循環することは可能ですか?

  3. Linux で PATH 変数を変更する方法

  1. bash の変数を持つエイリアス

  2. Bash変数の文字数をカウントするにはどうすればよいですか

  3. Bashのコマンド置換への変数代入の終了コード