通常、自分自身(およびGoogle)が理解できます。ところが最近、このような奇妙な現象のために混乱してしまいました。
背景:私は一連のスクリプトを使用してファイルを処理します(WindowsではCygwinで、スクリプトはOS Xでもgnu baseutilを使用して実行されます)。設置してから1日でリアルタイムツール、私のスクリプトが動作を停止しました。紆余曲折の最後にようやく問題を発見しました。
問題:次の行があります。
key=$( echo "$foo" | tr -d - | tr '[:upper:]' '[:lower:]' )
$foo
別のテキスト変数です。ダッシュを削除し$foo
て小文字に変換しました。スクリプトは何千回も実行されました。
しかし、これ以上ではありません。走れば
echo "Blah-Bleh" | tr -d - | tr '[:upper:]' '[:lower:]'
私はblahbleh
これが予想されることを理解しています。しかし、私がそうするなら
a=$(echo "Blah-Bleh" | tr -d - | tr '[:upper:]' '[:lower:]')
echo $a
私は何も得られませんでした。$a
空で [[-z $a]] が返されますtrue
。しかし、昔ながらのバックティックに戻ると、コマンドは再び機能します。
a=`echo "Blah-Bleh" | tr -d - | tr '[:upper:]' '[:lower:]'`
echo $a
与えられたblahbleh
。
今私できるすべてのコマンド置換を以前のスタイルに置き換えましたが、これは解決策ではなく回避策に近いです。それでは、StackExchangerの同僚の皆さん、私は何を逃したのですか?本当に迷惑です。
PSこれまで私の診断は次のとおりです。
- Rtoolsを削除しても役に立ちません。
- 機械を再起動しても役に立ちませんでした。
- 再インストールすべてCygwinパッケージは役に立ちません。
bash
バージョンは4.3.42(4)です。~/.bashrc
今、、、~/.bash_profile
には何もありません~/.profile
。 Rtools以前はわかりません。/etc/profile
/etc/bash.bashrc
- 問題が何であるかわかりません
$PATH
。
答え1
まあ、多くの操作と引っ張りの終わりにCygwinを再び操作順序に戻すことができました。これが私がしたことです:
- 削除されたRtools
- Cygwin/Rtools 関連エントリの Windows %PATH% をクリアします。
- キャッシュからすべてのCygwinパッケージを再インストールしました。
- 再設計されたCygwin;
- 必要以上にコンピュータを再起動しました。
また仕事に戻ります...
PS。 Cygwinは再び動作しましたが、bash配列に値を割り当てる元の行がもはや正しい結果を生成しないことがわかりました。これを変えなければならない
read -r -a array <<<$(printf $string)
これに関して
array=($(printf $string))
動作させる。 bash アップデートでなければなりません。そうする必要があります。
答え2
あなたのパイプラインが期待どおりに機能しない理由はよくわかりませんが、もっとうまくいくことができることを知っています。
a='Blah-Bleh'
a=${a//-/}; a=${a,,}
printf '%s\n' "$a"
これは組み込み置換を使用し、bash
コマンド置換よりも高速です。 1つ目はa=${a//-/}
すべてのダッシュを削除し$a
、2つ目は文字a=${a,,}
列全体を小文字にします。
bash
これは4.0以上で動作します。