현재 디렉터리를 변수에 할당하는 중 오류가 발생했습니다.

현재 디렉터리를 변수에 할당하는 중 오류가 발생했습니다.
    #!/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할당된 경우 두 번째 매개변수의 값을 인쇄하고, 그렇지 않으면 값 printf도 할당하여 인쇄합니다.$PWD$outDir

물론 여기에서 변수 호출은 ${outDir:=$PWD}null 또는 설정되지 않은 값에 대해 자체 수정되지만 해당 값이 맞는지 확인하지는 않습니다.실제로 디렉토리입니다. 위의 수표도 마찬가지입니다. 아마도 다음 중 어떤 것보다 더 나은 것은 다음과 같습니다.

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

cd사용자의 선택이 올바른지 확인할 뿐만 아니라 $outDir사용자에게 액세스 권한이 없으면 오류도 인쇄합니다. 테스트가 성공하면 cd -테스트 이전의 위치로 돌아갑니다. cd리디렉션은 >/dev/null단지 cd -인쇄를 방지하기 위한 것입니다 $PWD. 그렇지 않으면 사용될 때 이 작업을 수행합니다.

그러나 사용자가 하나를 지정하지 않으면 $outDir해당 값은 before 로 지정됩니다. $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>

저는 20년 동안 BASH 스크립트를 작성해 왔지만 그것이 작동할 것이라고는 예상하지 못했습니다. 스크립트는 최신 버전의 BASH에서 지원되는 구문을 사용하여 작성되어야 합니다.

개인적으로 나는 이것을 달성하기 위해 문자열을 사용할 것입니다. 나는 이전에 당신이 하는 일을 다른 사람이 하는 것을 본 적이 없습니다(제 생각엔 멋지네요):

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

또한 작은따옴표를 사용하면 변수 확장을 피할 수 있다는 점을 기억하세요.

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

산출:

/home/chris
$PWD
/home/chris

관련 정보