Bashで変数が関数に渡されたかどうかを確認する方法は?

Bashで変数が関数に渡されたかどうかを確認する方法は?

私はこれを持っています:

function abash {
    if [[ -v $1 ]]
        then
            atom ~/Shell/$1.sh
        else
            atom ~/.bashrc
    fi
}

Atomを使用してbashスクリプトを編集しやすくするために、私のファイルに入力が存在するかどうかを確認する必要がありますが、有効な入力を提供しても存在しないようです~/.bashrc。編集したい)がabashで開きます。この問題をどのように解決できますか?テストのアイデアはどこで得ましたか?[[ -v $1 ]]$1abash cd~/Shell/cd.sh~/.bashrc[[ -v $1]]これ答え。

答え1

なぜ失敗するのかよくわかりませんが、(少なくとも)2つの異なる可能なオプションがあります。[[ -v $1 ]]代わりに、次のいずれかのオプションを使用できます。

パラメータの数が0より大きいことを確認してください。

[[ $# > 0 ]]

最初のパラメータが空でないことを確認してください。

[[ $1 != '' ]]

答え2

bash条件式-v varの確認シェル変数ネーミングがvar設定されました。

使用すると、実際には[[ -v $1 ]]内容に応じて名前付き変数が設定されていることを確認します。$1あなたの場合は$cd設定されていないことを意味します。

$1以下を使用して、空でない文字列かどうかを簡単に確認できます-n

function abash {
    if [[ -n "$1" ]]
        then
            atom ~/Shell/"$1.sh"
        else
            atom ~/.bashrc
    fi
}

var必ずなければならないことを参考にしてくださいシェル変数仕事-v var。次のように表現されるので、決して[[ -v 1 ]]機能しません。1位置パラメータ

答え3

試験に必要なもの名前var、タグ名を使用してください。変数aをテストするには:いいえ`[[ -v $a ]] を実行すると、次のようになります。

[[ -v a ]]

-vただし、デフォルトでは位置パラメータに名前がないため、位置パラメータをテストする方法はありません。または、必要に応じて数値であり、テストは数値に適用されません。

-vしたがって、次のコマンドを使用せずにvarを直接テストする必要があります。

[[ ${1:+present} ]]

返品:

var拡張子を引用する必要があります。
私はチルダの代わりに$ HOMEを使用することを好みます。引用符付き文字列を受け入れます。

abash() {
    if [[ ${1:+present} ]]
        then
            atom "$HOME/Shell/$1.sh"
        else
            atom "$HOME/.bashrc"
    fi
}

正解はこれに似て:しかし、それがうまくいくように私が含めたものを覚えておいてください。

関連情報