ターミナルコマンドラインの環境とbashスクリプトの環境に何か違いがあることは知っていますが、その違いが何であるかはわかりません...
これが最終的に私がこの質問をするように導いた例です。それはいくつかの違いを洗い流すかもしれません。
このコマンドを使用して、数字から先行ゼロを削除しようとしています。
var="000123"; var="${var##+(0)}" ; echo $var
ターミナルのコマンドラインからこのコマンドを実行すると、次のようになります。 123
ただし、スクリプト内から実行すると、機能しません。私は得る:000123
私はUbuntu10.04を使用しており、samの結果で次のすべてを試しました。
私のbashバージョン41 5 1リリースi486-pc-linux-gnu(ターミナルとスクリプト内)
CLIとスクリプトの「ショップ」の違い:
CLI Script
on off checkwinsize
on off expand_aliases
on off extglob
on off histappend
off on hostcomplete
この違いの原因は何ですか?
いくつかのアップグレードが、それはスクリプトで動作するようになる場合であっても...
私が見つけることを試みている何をして、なぜ、そう将来的に、私は外を見るために何を知っていますよ。
先行ゼロを削除する3つのbashの方法を次に示します。(私が最初にこの質問をしたとき、私は1つしか知りませんでした)
var=0001230; var="$[10#$var]"; echo $var # fastest= 1.00 integers only
var=0001230; var="${var##+(0)}"; echo $var # slower x 1.25 works with strings, but requires shopt -s extglob
var=0001230; var="${var#${var%%[!0]*}}"; echo $var # slower x 1.61 works with strings
あなたの質問は一般的に答えることができません。しかし、いくつかのコメント。私のバージョンのbash(3.1.17(1)-release)では、コマンドラインから実行してもコマンドに目的の出力がありません。zshでも同じです。おそらく、あなたの命令について何かが怪しいです。「## +(0)」が何を達成するのかわかりませんが、「#0」は先行ゼロを1つ削除することに成功しました。これは、任意の数のゼロを削除する方法を示しています。
コマンドラインとスクリプトの動作に実際に違いがある場合は、スクリプトが異なるインタープリター(異なるbashバージョン、zshの代わりにbash)または異なるシェルオプション(実行してみてくださいshopt
)を使用している可能性があります。後者の違いは、あなたの対話型シェルの調達の結果であるかもしれない$HOME/.bashrc
と$HOME/.profile
スクリプトは、一般的にないのに対し。エクスポートすると継承されるため、環境変数には影響しませんが、すべてのシェルで設定する必要があるシェルオプションには影響します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加