私はこのコードを持っています:
[[ "$1" =~ [/\\]$ ]]
Linuxではうまく動作しますが、FreeBSDでテストするとエラーが発生します。./projekt2.sh: [[: not found
両方のシステムで動作する代替手段はありますか?ありがとう
BASHバージョン:4.3.30(1) - リリース
答え1
[[
屈辱だ。 /bin/sh
Bourne Again シェルは保証されません。
Linuxオペレーティングシステムでも、Debian Almquistシェルまたはポリシーに準拠した一般的なシェルです。 BSDではBourne Againシェルではありません。BSDでは、Bourne Againシェルはオペレーティングシステム自体にオプションの追加機能です。。内部にFreeBSDポートコレクション。 (「ポート」は、そのプログラムに対して外部管理されたソースストアからFreeBSDに別のプログラム(FreeBSDの一部ではない)を構築する便利な方法です。)
/bin/sh
BSDのコンテンツは通常、Bourneの初期の書き換えの1つです。 FreeBSDでは、Debian Linuxと同様にAlmquistシェルです。 (OpenBSDでは、POSIXモードで実行されるKornシェルです。)
バシズムには簡単なルールがあります。
スクリプトでbashismを使用している場合は、/bin/bash
スクリプトインタプリタとして明示的に設定してください。代わりにスクリプトソルバーとして使用する場合は、/bin/sh
POSIX準拠のシェル言語を使用してください。ホロ。
=~
これはbashismであり、このコマンドのPOSIX互換構文の一部ではありませんtest
。しかし、ここで正規表現はやや過剰です。明らかに、あなたが本当に欲しいのは、最後の文字をチェックするだけです。
Thorsten Glaserが2012年にこの種のことについて提案した内容は次のとおりです。
ケース $1 */|*\\) スイング;; *) スイング;; イサク
追加読書
- 「ユーティリティ:テスト」。 シェルコマンド言語。単一のUNIX仕様。問題6. IEEE 1003.1。 2013. グループを開きます。
- https://superuser.com/a/726762/38062
- https://superuser.com/a/696310/38062
sh
。 2014年1月26日。 FreeBSD 汎用コマンドマニュアル。- ダッシュ
/bin/sh
。 Ubuntu Wiki。 - ダッシュ
/bin/sh
。 Debian Wiki。 - バシズム。グレッグのウィキ。
- シェルコマンド言語。 IEEE規格1003.1。問題7.グループを開きます。
答え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/bin
Linuxの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