このexprはシェルスクリプトでどのような役割を果たしますか?

このexprはシェルスクリプトでどのような役割を果たしますか?

次の具体的な機能は何ですか?

newProg=`expr "${newProg}" : ".* -> \(.*\)$"`   
if expr "x${newProg}" : 'x/' >/dev/null; then    
   prog="${newProg}"     
else    
    progdir=`dirname "${prog}"`   
    prog="${progdir}/${newProg}"    
fi   

答え1

これ最初回線使用量expr到着する:

常にキャプチャして出力する貪欲なマッチングセマンティクス最後->このような一致なので、出力にaが絶対にないはずです。

たとえば、ls -lターゲットを見つけるためにシンボリックリンクの出力を解析します(正常に動作するファイル名などを提供し、一般的な警告を提供します)。

これ第二行は、expr新しい値がnewProgaで始まることを確認するために再利用されます/。つまり、絶対パスを表します。

この場合、progその値に設定するだけです。それ以外の場合は、on(このコードでは定義されていない変数)を使用して計算された相対progパスに設定します。その効果は、おそらく元の場所に基づいてルートを構築することです。dirname$prog


目標が単に純粋なPOSIXよりも強力なシェルまたは環境である場合、解析時間を節約するための非常に一般的なコマンドがexprあるかもしれません。readlinkls

関連情報