공백이 포함된 변수로 명령을 올바르게 테스트하는 방법은 무엇입니까?

공백이 포함된 변수로 명령을 올바르게 테스트하는 방법은 무엇입니까?

테스트를 만들려고하는데 논리는 다음과 같습니다.

If mkdir command is successfully executed perform the next actions

내가 가진 것은 다음과 같습니다.

FILEPATH=/home/Documents/projectDirectory
CREATE_DIRECTORY=mkdir $FILEPATH

테스트 명령:

if [ -e $FILEPATH ]; then
    echo "${FILEPATH} exists.."
    else 
        #Create the folder: Test it if is created , else exit gracefully.
        if [ -e "${CREATE_COMMAND}" ]; then
        echo "File created ${FILEPATH}"
        else
            echo "Error creating the filePath..exiting.."
            error_exit "Error creating the filePath..exiting.."
        fi
fi

답변1

왜 이렇게 하려는지 잘 모르겠지만 가능한 해결책은 다음과 같습니다.

FILEPATH=/home/Documents/projectDirectory
CREATE_DIRECTORY="mkdir $FILEPATH 2>/dev/null"
eval $CREATE_DIRECTORY
if [[ $? -eq 0 ]]; then
 echo "Directory created"
else
 echo "Directory already exists"
fi

그러면 폴더가 생성되고 오류 메시지가 표시되지 않고 /dev/null로 전달됩니다. 그런 다음 if 문에서 이전 명령의 상태를 확인하고 성공했는지(0) 알려줍니다.

답변2

현재 코드에는 다음과 같은 결함이 있습니다.

  • CREATE_DIRECTORY=mkdir $FILEPATH:
    1. mkdir $FILEPATH주위 에 따옴표가 없으므로 CREATE_DIRECTORY해당 mkdir값만 유지됩니다.
    2. $FILEPATH분사의 주제입니다.
    3. 이러한 확장의 첫 번째 토큰이 외부 명령인 경우 CREATE_DIRECTORY결과 확장의 환경으로 변수를 내보낼 수 있습니다.$FILEPATH
  • [ -e "${CREATE_COMMAND}" ]:
    1. CREATE_COMMAND우리가 아는 한, 이 변수는 값이 없습니다. 글을 쓰고 싶으신 것 같아요 CREATE_DIRECTORY.
    2. 성공 여부 를 테스트하지 않습니다 mkdir.

또한 if복합 명령을 사용하여 명령이 성공했는지 테스트할 수 있습니다.

if command; then
  # Code to execute if command succeeded
else
  # Code to execute if command failed
fi

따라서 코드는 다음과 같이 다시 작성할 수 있습니다.

FILEPATH=/home/Documents/projectDirectory

if [ -e "${FILEPATH}" ]; then
    echo "${FILEPATH} exists..."
else
    if mkdir "${FILEPATH}"; then
        echo "File created ${FILEPATH}"
    else
        echo "Error creating the filePath..exiting.."
        error_exit "Error creating the filePath..exiting.."
    fi
fi

알아채다:

  1. CREATE_DIRECTORY이 변수는 필수가 아닙니다.
  2. [ -e "${CREATE_COMMAND}" ]로 대체됩니다 mkdir "${FILEPATH}".

답변3

왜 이걸 할 수 없는지 정말 이해가 안 돼요

dir='/home/Documents/projectDirectory'

if ! mkdir "$dir"; then
    printf 'Something went wrong when trying to create "%s"\n' "$dir" >&2
    exit 1
fi

printf '"%s" created, now doing other things...\n' "$dir"

mkdir이미 존재하는 경우 $dir호출이 실패합니다.

디렉터리가 존재하도록 허용하고 mkdir생성이 실패한 경우에만 종료해야 하는 경우 위 호출 -p에 추가 mkdir하거나 디렉터리 존재에 대해 명시적인 테스트를 수행합니다.

dir='/home/Documents/projectDirectory'

if [ ! -d "$dir" ]; then
    if ! mkdir "$dir"; then
        printf 'Something went wrong when trying to create "%s"\n' "$dir" >&2
        exit 1
    fi

    printf '"%s" created\n' "$dir"
fi

echo 'now doing other things...'

나는 그것이 디렉토리인지 -d테스트하기 위해 여기서 테스트를 사용하고 있습니다 . $dir나는 스크립트의 나머지 부분에서 이름이 단순한 것 이상이어야 한다고 생각했기 때문에 이렇게 했습니다.존재하다그러나 이는 실제 디렉토리를 나타냅니다.


명령을 변수에 저장하려고 하지 마십시오. 그렇게 해야 하는 경우는 거의 없습니다. 이는 타이핑 시간을 절약하는 좋은 방법이 아닙니다. 쉘 스크립트에서 무언가를 수행하기 위해 더 짧은 방법이 필요한 경우 이에 대한 쉘 함수를 작성하십시오.

또한 습관을 길러주세요.언제나변수 확장을 큰따옴표로 묶으십시오. 이렇게 하면 쉘 스크립트가 항상 공백이 포함된 파일 이름을 올바르게 처리하고 파일 이름 글로빙이 실수로 호출되지 않습니다.

관련된:


다른 것들:

CREATE_DIRECTORY=mkdir $FILEPATH

이는 해당 환경에서 명령으로 실행됩니다 $FILEPATH. 디렉터리(존재하는 경우)이거나 적어도 명령이 아니기 CREATE_DIRECTORY=mkdir때문에 실패합니다 .$FILEPATH

값에 공백이 있는 변수를 생성하려면 값을 인용하십시오.

if [ -e "${CREATE_COMMAND}" ]; then

~ 할 것이다아니요디렉터리를 만듭니다. in의 값이 $CREATE_COMMAND파일 계층 구조의 이름과 일치하는지 테스트합니다.

그것이 무엇인지는 모르겠지만 아마도 간단하게 및/또는 유사한 의 약어일 것입니다 error_exit. 그렇죠?echoexit 1

관련 정보