Como testar corretamente um comando como uma variável que contém espaços?

1

Estou tentando criar um teste, enquanto a lógica é

If mkdir command is successfully executed perform the next actions

O que eu tenho são:

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

e o comando de teste:

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
    
por Jepoy 28.02.2018 / 05:08

3 respostas

0

Não sei por que você gostaria disso, mas aqui está uma solução funcional:

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

Isso tentará criar a pasta e canalizar qualquer mensagem de erro para / dev / null (não exibi-la). Em seguida, ele verifica o status do comando anterior na instrução if e, se tiver êxito (0), informará a você.

    
por 28.02.2018 / 06:30
0

Seu código atual tem as seguintes falhas:

  • %código%:
    1. Como não há cotações em torno de CREATE_DIRECTORY=mkdir $FILEPATH , mkdir $FILEPATH contém apenas CREATE_DIRECTORY como seu valor.
    2. mkdir é o assunto da divisão de palavras.
    3. A variável $FILEPATH pode ser exportada para o ambiente da expansão resultante de CREATE_DIRECTORY se o primeiro token de tal expansão for um comando externo.
  • %código%:
    1. A variável $FILEPATH não tem valor, até onde sabemos. Eu suponho que você quisesse escrever [ -e "${CREATE_COMMAND}" ] .
    2. Ele não testa se CREATE_COMMAND foi bem-sucedido ou não.

Além disso, o comando CREATE_DIRECTORY compound pode ser usado para testar se um comando foi bem-sucedido ou não:

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

Assim, seu código pode ser reescrito como:

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

Observe que:

  1. A variável mkdir não é necessária.
  2. if foi substituído por CREATE_DIRECTORY .
por 28.02.2018 / 07:52
0

Eu realmente não vejo porque você não pode simplesmente fazer

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"

A chamada para mkdir falhará se $dir já existir.

Se você precisar que o diretório exista e só resista se mkdir falhar em criá-lo, adicione -p à chamada mkdir acima ou faça um teste explícito para a existência do diretório :

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...'

Estou usando o teste -d aqui para testar se $dir pode ser um diretório. Eu faço isso porque suponho que o resto do script exigirá que o nome não exista apenas , mas que se refira a um diretório real.

Não tente armazenar comandos em variáveis, raramente, ou nunca, o que você precisa fazer. Não é uma boa maneira de economizar em digitar as coisas. Se você precisar de uma maneira mais curta de executar uma ação em um script de shell, crie uma função de shell para ela.

Além disso, adquira o hábito de sempre citar duas vezes suas expansões variáveis. Dessa forma, seus scripts de shell sempre manipularão nomes de arquivos com espaços e nunca invocarão acidentalmente o globbing de nomes de arquivo.

Relacionados:

Outras coisas:

CREATE_DIRECTORY=mkdir $FILEPATH

Isso executará $FILEPATH como um comando com CREATE_DIRECTORY=mkdir em seu ambiente. Ele falhará porque $FILEPATH é um diretório (se existir) ou pelo menos não um comando.

Para criar uma variável com espaços em seu valor, cite o valor.

A linha

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

não criará um diretório. Ele testará se o valor em $CREATE_COMMAND corresponde a um nome na hierarquia de arquivos.

Eu não sei o que é error_exit , mas provavelmente é uma abreviação de um simples echo e exit 1 ou similar, certo?

    
por 28.02.2018 / 07:55