1

次のシェルスクリプトは、現在のディレクトリをデスクトップに変更します。

v=~/Desktop/
cd $v
pwd # desktop

次のスクリプトは、エラーを生成する代わりに、現在のディレクトリをホームディレクトリに変更します。

cd $undefined_variable
pwd # home directory
echo $? # 0

新しい現在のディレクトリの変数のスペルを間違えると、スクリプトによって重要なファイルが削除されるのではないかと心配しています。

一般的に、シェルスクリプトの変数を使用して現在のディレクトリを安全に変更するにはどうすればよいですか?

4

6 に答える 6

2

使用する:

cd ${variable:?}

$variable が定義されていないか空の場合、bash はエラーをスローして終了します。これはオプションに似ていset -uますが、ファイル全体ではグローバルではありません。

于 2012-11-01T13:30:23.747 に答える
1

条件を使用できますtest -d(指定された変数がディレクトリであるかどうかをチェックします)。

if [[ -d $undefined_variable ]]
then
  cd $undefined_variable
  echo "This will not be printed if $undefined_variable is not defined"
fi

その他のテストオプションについては、こちらも参照してください...

于 2012-11-01T13:15:27.773 に答える
1

ラッパーを作成する必要があります(これはbashで動作します):

cd() {
    if [ $# -ne 1 ] ;then
        echo "cd need exactly 1 argument" >&2
        return 2
      fi
    builtin cd "$1"
}
于 2012-11-01T13:36:29.207 に答える
1

未定義の変数を展開するたびに、エラーで終了set -uすることができます。bash

于 2012-11-01T13:17:47.703 に答える
1

Bourne シェルには、未定義の変数を値で置き換える構造があります${varname-subtitution}。これを使用して、変数が未定義の場合に安全なフォールバック ディレクトリを作成できます。

 cd "${undefined-/tmp/backupdir}"

という名前の変数がある場合undefined、その値が代入されます。そうでない場合/tmp/backupdirは、代入されます。

変数展開も二重引用符で囲んでいることに注意してください。これは、スペースを含む文字列で単語が分割されるのを防ぐために使用されます (Windows ディレクトリでは非常に一般的です)。このようにして、スペースを含むディレクトリでも機能します。

すべてのシェル置換構造 (POSIX シェルにはさらに 7 つある) の詳細については、シェル マニュアルのパラメータ置換セクションを参照してください。

于 2012-11-01T13:29:51.893 に答える
0

はい、パラメータなしで
入力cdすると、ホームディレクトリにジャンプします。コマンドを実行する前に、nullまたは空の変数を確認できますcd

次のようにチェックします(cdはtargetDirが空でない場合にのみ呼び出されます):

test -z "$targetDir" || cd $targetDir

次のようにチェックします(cdはtargetDirが実際に存在する場合にのみ呼び出されます):

test -d "$targetDir" && cd $targetDir

注: -1をありがとう、最後の文も読む必要があります。だから私は本当の答えを追加しました。

于 2012-11-01T13:16:56.180 に答える