37

testシェル スクリプトを使用すると、さまざまな変数展開方法や[やや などのプログラムがあるため、この種のことを (ほとんどのプログラミング言語よりも) 膨大な数の方法で実行できることは明らかです[[

今、ちょうど探しています

DIR=$1 or .

つまり、私の DIR 変数には、最初の引数または現在のディレクトリで指定されているものが含まれている必要があります。

これと はどう違いDIR=${1-.}ますか?

ハイフンの構文はわかりにくいので、より読みやすい構文を探しています。

なぜ私はこれを行うことができないのですか?

DIR="$1" || '.'

これは、「$1 が空の場合、割り当ては引き続き機能する (DIR が空になる) ため、無効なコマンド '.' を意味すると推測しています。処刑されることはありません。」

4

3 に答える 3

68

ここにいくつかの質問があります。

  1. 「このロジックを実際に反映するものを書くことはできますか」</p>

    はい。いくつかの方法があります。ここに1つあります:

    if [[ "$1" != "" ]]; then
        DIR="$1"
    else
        DIR=.
    fi
    
  2. 「これと の違いは何DIR=${1-.}ですか?」

    構文は、設定されていない場合に${1-.}展開されますが、設定されている場合と同じように展開されます (空の文字列に設定されている場合でも)。.$1$1$1$1

    が設定されていないか、空の文字列に設定されている場合、構文は次の${1:-.}ように展開されます。が空の文字列以外に設定されている場合にのみ展開されます。.$1$1$1

  3. 「なぜ私はこれを行うことができないのですか? DIR="$1" || '.'」</p>

    これは bash であるため、perl や Ruby などの言語ではありません。(私の卑劣さを許してください。)

    bash では、||コマンド全体を分離します (技術的にはパイプラインを分離します)。表現を分離しません。

    SoDIR="$1" || '.'は「実行DIR="$1"し、ゼロ以外の終了コードで終了する場合は実行する」という意味'.'です。

于 2013-04-18T05:11:36.847 に答える
4

これはどう:

DIR=.
if [ $# -gt 0 ]; then
  DIR=$1
fi

$#はスクリプトに与えられた引数の数であり、-gt「より大きい」を意味するため、基本的DIRにデフォルト値に設定し、ユーザーが引数を指定した場合は、DIR代わりにその値に設定します。

于 2013-04-18T05:00:02.647 に答える