FreeBSD 二重角括弧

FreeBSD 二重角括弧

私はこのコードを持っています:

[[ "$1" =~ [/\\]$ ]]

Linuxではうまく動作しますが、FreeBSDでテストするとエラーが発生します。./projekt2.sh: [[: not found両方のシステムで動作する代替手段はありますか?ありがとう

BASHバージョン:4.3.30(1) - リリース

答え1

[[屈辱だ。 /bin/shBourne Again シェルは保証されません。

Linuxオペレーティングシステムでも、Debian Almquistシェルまたはポリシーに準拠した一般的なシェルです。 BSDではBourne Againシェルではありません。BSDでは、Bourne Againシェルはオペレーティングシステム自体にオプションの追加機能です。。内部にFreeBSDポートコレクション。 (「ポート」は、そのプログラムに対して外部管理されたソースストアからFreeBSDに別のプログラム(FreeBSDの一部ではない)を構築する便利な方法です。)

/bin/shBSDのコンテンツは通常、Bourneの初期の書き換えの1つです。 FreeBSDでは、Debian Linuxと同様にAlmquistシェルです。 (OpenBSDでは、POSIXモードで実行されるKornシェルです。)

バシズムには簡単なルールがあります。

スクリプトでbashismを使用している場合は、/bin/bashスクリプトインタプリタとして明示的に設定してください。代わりにスクリプトソルバーとして使用する場合は、/bin/shPOSIX準拠のシェル言語を使用してください。ホロ

=~これはbashismであり、このコマンドのPOSIX互換構文の一部ではありませんtest。しかし、ここで正規表現はやや過剰です。明らかに、あなたが本当に欲しいのは、最後の文字をチェックするだけです。

Thorsten Glaserが2012年にこの種のことについて提案した内容は次のとおりです。

ケース $1
    */|*\\)
        スイング;;
    *)
        スイング;;
イサク

追加読書

答え2

この[[構文はkshとbashで、すべてのシェルには存在しません。 FreeBSDデフォルトシェルはbashの代わりにすることができますsh(またはbashは同様の機能を実行します)。shすべてのシェルに適用される同等の構文は次のとおりです。

case $1 in
        *[/\\] ) echo "Yes";;
esac

答え3

この[[構造はすべてのshバリアントには存在しません。 bashとzshで採用されたkshです。 FreeBSDのshはashの派生物であり、サポートされていません[[

[[スクリプトで使用するには、次を使用します。シェルボーンサポートチームに連絡してください[[。 bash、ksh93、またはmkshをFreeBSDにパッケージとしてインストールできます[[。パッケージは下にインストールされ、/usr/local/binLinuxのbashはほとんど常に下にインストールされます/bin。これを使用して/usr/bin/envプログラムを呼び出すことができますPATH(これは古典的なハッキングです)。したがって、bash およびその他の bash 構成を使用するには、[[bash パッケージがインストールされていることを確認し、次のようにスクリプトを起動します。

#!/usr/bin/env bash

または、Linuxでシンボリックリンクを作成し、次のように/usr/local/bin/bash -> /bin/bashスクリプトを起動します。

#!/usr/local/bin/bash

/bin/bash -> /usr/local/bin/bashまたはFreeBSDでシンボリックリンクを作成します#!/bin/bash

または、共通のshコアに従うスクリプトを作成します。[代わりに使用してください[[。これは[予約語ではなく一般的なコマンドなので、単一の括弧内の内容は二重括弧内の内容とは異なり、通常は解析されます[[ condition1 && condition2 ]]。角かっこを作成する必要があります[ condition1 ] && [ condition2 ]。通常のshには正規表現の一致設定はありませんが、実行中の操作にはワイルドカードパターンの一致で十分です。

case "$1" in
  *[\\/]) echo "$1 ends with a slash or backslash";;
  *) echo "$1 does not end with a slash or backslash";;
esac

関連情報