私のシェルスクリプトで「コマンドステートメント:見つかりません」エラーが発生するのはなぜですか?

私のシェルスクリプトで「コマンドステートメント:見つかりません」エラーが発生するのはなぜですか?

declare以下は、スクリプトでこれを使用することを示す簡単な例です。しかし、getスクリプトは次のようになります。

$ cat /tmp/new
#! /bin/sh
declare -i  hello
$ chmod a+rwx /tmp/new
$ /tmp/new
/tmp/new: 3: declare: not found
$ source /tmp/new
$ 

スクリプトを直接実行するのはうまくいきませんが、ソーシングするのはなぜ機能するのか疑問に思います。最初のタスクをどのように機能させることができますか?ありがとうございます!

答え1

declareは組み込み関数なので、一緒に使用することは/bin/shできません。構文はシェルによって異なる場合があります。したがって、sheebang()を選択する必要があります。スクリプトをbashとして実行する必要がある場合は、最初の行は次のようになります。bashzsh#!

#!/bin/bash

または

#!/usr/bin/env bash

答え2

declarebash と zsh 拡張です。あなたのシステムでは/bin/shbashやzsh(おそらくash)ではないため、declare使用できません。typeset代わりにはdeclare同義語ですが、typesetkshでも動作します。 Ashtypeset -iや他のほとんどの用途には同等の機能は組み込まれていません。typeset実際に整数変数を宣言する必要はありません。 fortypeset -iのようないくつかの構文ショートカットを許可するだけです。hello=2+2hello=$((2+2))

答え3

declare定義したシェルにない可能性があります。シェルボーン- #! /bin/sh

試して#!/bin/bashみてください。

ソーシングが機能する理由は、すでにアサーションをサポートするシェルにあるためです。したがって、これを調達しても新しいシェルは開きません。使わなかった知らない人は立場をとります。

答え4

Bashの他の2つのバージョンを試すこともできますdeclare。つまり、typesetlocal。それらはすべて-i次のものに関連しています。整数)。私も参照してくださいテストスクリプト。 PS。declareまだ実装されていません機械的人造人間(MKSH).

関連情報