フィールド分割は移植的に実行されますが、他の拡張は行われません。

フィールド分割は移植的に実行されますが、他の拡張は行われません。

私はコンパイラフラグを保存する$variableときに引用されていない拡張を使用しましたが、最近はvariableglobのようなメタ文字がまだ拡張されていることがわかりました。*?variable

$ f='*'
$ echo $f
foo.bash

とは別にset -f

Bashで私が考えることができる最も明確な方法は、read_words配列名を引数として渡された文字列の内容で埋め、それを使用して${arr[@]}その文字列を拡張する関数を定義することです。

#!/bin/bash

count() {
  printf '%s\n' "$#"
}


read_words() {
  IFS=$' \t\n' read -a "$1" <<< "$2"
  return 0
}

read_words arr 'a b *'
count "${arr[@]}"

ベストアンサー1

set -fワイルドカードなしでフィールド分割を実行する最も便利な方法です。

では、bashテストでシェルオプションが設定されているかどうかをテストできます-o。だからあなたはこれを行うことができます:

if [ ! -o noglob ]; then
    set -f
    trap 'set +f' RETURN
fi

これはシェルオプションnoglob(の長い名前set -f)の状態を検出します。設定しないと、トラップが設定されてインストールRETURNされます。noglobスクリプトが完了すると、トラップはシェルオプションの設定を解除します。スクリプトソースの場合。スクリプトにソースがない場合、トラップは何もしません。

興味深い点:ソーススクリプトはシェル関数と非常によく似ています。

おすすめ記事