スクリプトの実行時に[[:not found]を取得するのはなぜですか?


14

ファイルが存在するかどうかを確認する必要があるスクリプトを記述しようとしています。コンソールで書きます

if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

そして私は得る

not mod

しかし、私が同じことをするスクリプトを書くとき:

#!/bin/sh
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

そして、スクリプトを実行すると、これが得られます:

./ex.sh: 2: [[: not found
mod

スクリプトを現在のディレクトリに保存し、ex.shという名前を付けて、実行可能であることを確認しました。スクリプトを呼び出すには、これを行います:

./ex.sh

この問題が発生するのはなぜですか?私はすでに多くのことを試しました:

if [ -a /home ...

そして

if test -a /home ...

両方とも戻ります

13: -a: unexpected operator

私はそれを機能させることができましたが、そのために最初の行(#!/ bin / sh)を削除する必要がありました。これがなぜ起こるのか知っていますか?
ブズ

試してください#!/bin/bash
ケブ

こんにちはケブ、私もそれを緩和しました。質問を更新しました。私はこれに多くの時間を費やしましたが、解決できてうれしいです。ご回答有難うございます。それは確かに、問題の解決策です。
ブズ

@Kevそれを答えとして投稿してください
slhck

Buzu、@ Kev-回答が見つかった場合、以下の回答として投稿してください。質問は編集しないでください。
-user1686

回答:


9

あなたがのために書かれたスクリプト実行しているbashのshの拡張構文の機能の多く欠けている、 - [[であるbash組み込みコマンドとでは使用できませんsh

またはに変更#!/bin/shします。#!/bin/bash#!/usr/bin/env bash


一部のシステムで/bin/shは、へのシンボリックリンク/bin/bashです。そして、それがであると仮定することbashはおそらく合理的に安全です/bin/bash
キーストンプソン

@キース:/bin/bashほとんどのLinuxシステム上にありますが/usr/pkg/bin/bash、BSD上、または/usr/local/bin/bashソースから直接コンパイルする場合です。
user1686

@grawity:または、ソースからコンパイルする場合は、他の場所に配置することにします。いいですね 個人的には、/usr/bin/envハック(現時点でbash呼び出し元$PATHにあるものを使用)を使用するよりも、各システムのシバンを編集したいのですが、YMMVです。(そして、あなたが作ることができます/bin/bashシンボリックリンクを-あなたが管理者権限を持っていて、いじり気にしない場合/bin。)
キース・トンプソン

@Keith:/usr/localautotoolsがデフォルトで配置する場所です。「個人的に」は、複数の異なるサーバーとVMが同じスクリプト/ツールリポジトリからプルし、コミットのたびにそれらの半分のシェバンを再編集する必要がないようにしています。
user1686

それらのどれも私のために働いた:/ centosのim
astroanu

0

スクリプトの実行時にshではなくbashを指定します。私は個人的にはubuntu 12.10では異なることに気付きました:

bash script.sh arg0 ... argn

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.