将当前目录分配给变量时出错

将当前目录分配给变量时出错
    #!/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未设置或空值的$outDir事件,是吗?$outDir

我认为以下是等效的:

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

如果$outDir已经被赋值,那么,对于的第二个参数,打印它的值,否则它同时赋值toprintf的值并打印它。$PWD$outDir

当然,虽然这里的${outDir:=$PWD}变量调用会自我更正空值或未设置的值,但它不会尝试验证它是实际上是一个目录。您上面的支票也是如此。因此可能比其中任何一个更好的是:

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

cd不仅会验证用户的选择是否$outDir正确,如果用户无法访问,它还会打印错误。如果测试成功,cd -只会将您带回到测试之前的位置。cd重定向>/dev/null只是为了防止cd -打印$PWD,否则使用时它会执行此操作。

然而,如果用户没有指定$outDir,那么它的值将像以前一样被指定为 的值$PWD,这意味着测试成功并且cd $PWD连续两个命令-被 替换$OLDPWD- 这里也是$PWD

答案2

outDir="$PWD"

echo此外:对我来说,仅使用一个参数似乎更有用:

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>

我编写 BASH 脚本已经有 20 年了,我没想到它会起作用。该脚本必须使用较新版本的 BASH 支持的语法编写。

我个人会用一个字符串来实现这一点。我以前从未见过有人做过你做的事情(我认为这很酷):

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

另请记住,您可以通过使用单引号来避免变量扩展:

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

输出:

/home/chris
$PWD
/home/chris

相关内容