.以下の
コードスニペットから: {}
()
#!/bin/bash
set -e
echo "two">file.txt
ARRAY=(one two three)
rc=0
for i in ${ARRAY[@]}; do
echo "grepping $i "
#grep "$i" file.txt || (echo "failed grep" && exit 1) <--1
#grep "$i" file.txt || {rc=$? && echo "failed grep"} <--2
grep "$i" file.txt || (rc=$? && echo "failed grep") <--3
done
exit $rc
コマンド2は動作しない唯一のコマンドです。しかし、私はそれがうまくいくと予想しており、コマンド1は許可された答えに従ってスクリプトを終了しません。ここ
何が起こっているのかを説明できる人はいますか?
ベストアンサー1
bash
ほとんどのPOSIXシェルでは、while(
とはシェル構文の特殊表示文字です(、、、、、...)
などの複数文字表示の一部を含む、発生するたびに特別に処理されます)。組み合わせは、inなどの特殊表示文字を使用するか、特殊またはフォームに使用されます。((
$(
<(
$((
<#((
{
}
${
{x,y}
{x..y}
echo )
whileはエラーが発生しますが、echo }
出力がないため、inを閉じることは不可能であることがわかります。}
}
{echo}
{
具体的{
に}
キーワード良いwhile
、、、。time
!
コマンドが必要な場合にのみ(最初の近似で)別の単語としてのみ表示できます。
{echo
次のキーワード{echo
ではなくコマンドになります。キーワードの後にitが来るのではなく、コマンドと同じです。{
echo
while[
while[
while
[
とが分離されてコマンド位置にある場合、またはを使用できますが、は使用できません{ echo;}
。{<file cat;}
{
}
{echo}
しかし、いくつかの例外があります。通常、リダイレクト以外には何も起こらず、コマンドの位置にない{(echo test)}
閉じた後もこれが機能することがわかります。指揮ポジションにいない二人目も同様です。)
}
{ { echo; } }
}
{ echo; ! }
または{ echo; time }
ksh93では動作しますが、動作しません(コマンド位置にbash
あっても)。}
1つの例外は、可能な場合とトークンとして認識zsh
しようとすることです。つまり、指揮位置にあり、特定の限られた状況にあるときです。そこでは動作しますが、たとえば動作しません。 bash / kshの代わりにそこのようです。{
}
{echo}
{{echo}}
{{echo} }
{echo,foo}
{ echo,foo;}
echo foo
<file {head;head}
動作しますzsh
が、他のシェルでは動作しません。
これはIGNORE_BRACES
オプションによってIGNORE_CLOSE_BRACES
制御されます。