いくつかのシェル(を含むbash):
IFS=: command eval 'p=($PATH)'
(でbash、commandsh / POSIXエミュレーションにない場合は省略できます)。ただし、引用符で囲まれていない変数を使用する場合はset -f、一般的にも必要であり、ほとんどのシェルではそのためのローカルスコープがないことに注意してください。
zshを使用すると、次のことができます。
(){ local IFS=:; p=($=PATH); }
$=PATHデフォルトでは行われない単語分割を強制することですzsh(変数展開時のグロビングも行われないためset -f、shエミュレーション以外では必要ありません)。
(){...}(またはfunction {...})は匿名関数と呼ばれ、通常はローカルスコープを設定するために使用されます。関数でローカルスコープをサポートする他のシェルでは、次のようなことを行うことができます。
e() { eval "$@"; }
e 'local IFS=:; p=($PATH)'
POSIXシェルで変数とオプションのローカルスコープを実装するには、https://github.com/stephane-chazelas/misc-scripts/blob/master/locvar.shで提供されている関数を使用することもできます。その後、次のように使用できます。
. /path/to/locvar.sh
var=3,2,2
call eval 'locvar IFS; locopt -f; IFS=,; set -- $var; a=$1 b=$2 c=$3'
(ところで、他のシェルの$PATH場合を除き、上記の方法で分割することは無効ですzsh。IFSはフィールド区切り文字ではなくフィールド区切り文字です)。
IFS=$'\n' a=($str)
ちょうど2つの割り当てで、次のように次々に割り当てられa=1 b=2ます。
以下に関する説明のメモvar=value cmd:
に:
var=value cmd arg
シェルの実行/path/to/cmd、新しいプロセスやパスでcmdとarg中argv[]とvar=valueでenvp[]。これは実際には変数の割り当てではなく、実行されたコマンドに環境変数を渡すことです。BourneシェルまたはKornシェルではset -k、と書くこともできますcmd var=value arg。
現在、それは実行されない組み込み関数または関数には適用されません。Bourneシェルでは、でvar=value some-builtin、単独でのvar場合と同様に、後で設定されvar=valueます。これは、たとえば、var=value echo foo(役に立たない)の動作echoが組み込みかどうかによって異なることを意味します。
POSIXおよび/またはそれをksh変更しました。Bourneの動作は、特別なbuiltinsと呼ばれるビルトインのカテゴリでのみ発生します。eval特別なビルトインであり、そうでreadはありません。特別なビルトインでvar=value builtinはvarない場合は、ビルトインの実行のみを設定します。これにより、外部コマンドが実行されているときと同様に動作します。
このcommandコマンドを使用して、これらの特別なビルトインの特別な属性を削除できます。POSIXが見落としているのは、とビルトインの場合、シェルは変数スタックを実装する必要があることを意味します(コマンドまたはスコープ制限コマンドを指定していなくても)。eval.localtypeset
a=0; a=1 command eval 'a=2 command eval echo \$a; echo $a'; echo $a
あるいは:
a=1 command eval myfunction
をmyfunction使用または設定し$a、潜在的にを呼び出す関数であるcommand eval。
ksh(仕様の大部分が基づいている)それを実装していなかった(そしてAT&T kshとzshまだ実装していない)ので、それは本当に見過ごされましたが、今日、これら2つを除いて、ほとんどのシェルが実装しています。動作はシェルによって異なりますが、次のようなものです。
a=0; a=1 command eval a=2; echo "$a"
しかし。localそれをサポートするシェルで使用することは、ローカルスコープを実装するより信頼性の高い方法です。
IFS=: command eval …設定します。kshが奇妙な非準拠のone-outであるのは珍しいことです。IFSeval