現在のディレクトリを変数に割り当て中にエラーが発生しました。

現在のディレクトリを変数に割り当て中にエラーが発生しました。
    #!/usr/bin/env bash  
    if [ "$outDir" == "" ]
    then
        echo "$PWD" ,"We are here ", $outDir ," with " 
        "$outDir" = "$PWD"
        echo "Yes"
    fi

ターミナル出力:

/home/Documents/folderName ,We are here , , with

./pipeline.sh: line 28: : command not found

Yes

現在、ディレクトリを$ outDirに割り当てることはできません。

私は試しましたが、"outDir" = "$PWD"何も$outDir="$PWD"動作"$outDir"=$PWDしません。しかし、echo $PWD非常にうまく動作します。

なぜできないの働く

答え1

$PWD設定されていない値またはnull値を使用してイベントを割り当てたいと思います$outDir。そうですか?$outDir

私は以下が同じだと思います。

printf 'We are here: "%s"\n $outDir = "%s"\n' \ 
    "$PWD" "${outDir:=$PWD}"

$outDir割り当てられている場合は2番目のパラメータの値を印刷し、そうでない場合は値printfも割り当てて印刷します。$PWD$outDir

もちろん、ここでは変数呼び出しは${outDir:=$PWD}nullまたは設定されていない値に対して独自に変更されますが、その値が正しいことを確認しません。実際にはディレクトリです。上記の小切手も同様です。おそらく、次のいずれかより良いものは次のとおりです。

cd -- "${outDir:=$PWD}" || exit; cd - >/dev/null

cdユーザーの選択が正しいことを確認するだけでなく、$outDirユーザーにアクセス権がない場合はエラーも印刷します。テストが成功すると、cd -テスト前の位置に戻ります。cdリダイレクトは>/dev/null単にcd -印刷を防ぐためのものです$PWD。それ以外の場合は、この操作を行います。

ただし、ユーザーが1つを指定しない場合、$outDirその値はbeforeとして指定されます。$PWDつまり、テストが成功し、cd $PWD2つの連続したコマンドがここでも-変わったことを意味します。$OLDPWD$PWD

答え2

outDir="$PWD"

echoまた:私にとっては、パラメータを1つだけ使用する方が便利です。

echo "${PWD} ,We are here , ${outDir} , with "

このifテストは次のように置き換えることができます。

if [ -z "$outDir" ]

答え3

最初のechoコマンドの後には改行文字が続くので、"$outDir" = "$PWD"コマンドとして扱われます。

最初のエコー行に追加することも、"$outDir" = "$PWD"最初のエコー行の末尾に行連続文字を追加することもできます。

#!/usr/bin/env bash  
if [ "$outDir" == "" ]
then
    echo "$PWD" ,"We are here ", $outDir ," with ", \
    "$outDir" = "$PWD"
    echo "Yes"
fi

または

#!/usr/bin/env bash  
if [ "$outDir" == "" ]
then
    echo "$PWD" ,"We are here ", $outDir ," with ", "$outDir" = "$PWD"
    echo "Yes"
fi

希望の出力を提供します。

[sri@localhost ~]$ ./crap.bsh 
./crap.bsh 
/home/sri ,We are here , , with ,  = /home/sri
Yes

これが私の最初の答えのテキストです。 無視。

それは実際に(私の箱で)動作し、私はショックを受けました。まずスクリプト:

#!/usr/bin/env bash
if [ "$outDir" == "" ]
then
    echo "$PWD", "We are here", $outDir, "$outDir" = "$PWD"
    echo "yes"
fi

これが出力です

./test.bsh
/home/chris, We are here, ,  = /home/chris
yes

私はそれがbashのバージョンに関連していると思います。これは私のものです:

bash --version
GNU bash, version 4.2.45(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

私は20年間BASHスクリプトを書いてきましたが、それがうまくいくとは思いませんでした。スクリプトは、最新バージョンのBASHでサポートされている構文を使用して作成する必要があります。

個人的には、これを達成するために文字列を使用します。私はあなたが以前にしたことを他の人がすることを見たことがありません(私の考えでは素晴らしいです):

echo "$PWD, We are here, $outDir, $outDir = $PWD"

また、一重引用符を使用すると変数の拡張を避けることができることも覚えておいてください。

echo "$PWD"
echo '$PWD'
echo "$(pwd)"

出力:

/home/chris
$PWD
/home/chris

関連情報