Necesito crear un script de Shell que verifique la presencia de un archivo y, si no existe, lo crea y pasa al siguiente comando, o simplemente pasa al siguiente comando. Lo que tengo no hace eso.
#!/bin/bash
# Check for the file that gets created when the script successfully finishes.
if [! -f /Scripts/file.txt]
then
: # Do nothing. Go to the next step?
else
mkdir /Scripts # file.txt will come at the end of the script
fi
# Next command (macOS preference setting)
defaults write ...
El retorno es
line 5: [!: command not found
mkdir: /Scripts: File exists
Ni idea de qué hacer. Cada lugar que me trae una búsqueda de Google indica algo diferente.
Posiblemente una solución más simple, no es necesario hacer pruebas explícitas, solo use:
mkdir -p /Scripts
touch /Scripts/file.txt
Si no desea que touch
cambie el tiempo de "modificación" de un file.txt
Existente, puede usar touch -a /Scripts/file.txt
Para hacer que touch
solo cambie los tiempos de "acceso" y "cambio".
Recibes el error porque no hay espacio entre [
y !
sin embargo, también hay algunos defectos en su código. Primero está verificando si el archivo no existe, y si no está haciendo nada. Si el archivo sí existe, está creando un directorio (pero no está haciendo nada para crear el archivo).
Tampoco necesita la operación nula, simplemente debería poder hacer:
#! /bin/bash -
if [[ ! -e /Scripts/file.txt ]]; then
mkdir -p /Scripts
touch /Scripts/file.txt
fi
[command2]
Esto está comprobando si /Scripts/file.txt
no existe, creará el /Scripts
directorio y luego el file.txt
archivo. También puede verificar la existencia del directorio por separado si lo desea. Además aviso que estoy usando -e
en lugar de -f
como pediste simplemente para verificar la existencia de un archivo que es lo que -e
hará donde -f
comprueba que es un "archivo normal" http://tldp.org/LDP/abs/html/fto.html
Para empezar, script de Shell no es script de bash, así que hagamos que su código sea más general:
#!/bin/sh
Todos los sistemas Posix deben tener ese archivo; bash es estrictamente opcional.
No es necesario probar si el directorio existe, solo
dir=/Scripts
mkdir -p $dir
Para crear el archivo si no existe,
filename=$dir/file.txt
test -f $filename || touch $filename
O si lo prefieres
filename=$dir/file.txt
if [ ! -f $filename ]
then
touch $filename
fi
Tienes un error sintáctico. Necesita espacios antes y después del [
y ]
.
#!/bin/bash
# Check for the file that gets created when the script successfully finishes.
CHECKFILE="/Scripts/file.txt"
CHECKDIR=$( dirname "$CHECKFILE" )
# The directory with the file must exist
mkdir -p "$CHECKDIR"
if [ ! -f "$CHECKFILE" ]; then
# What to do if the file is not there
fi
touch "$CHECKFILE"
Lo anterior supone que no hay "trucos" como crear un directorio llamado /Scripts/file.txt
(que podría ser una forma de obligar al script a ingresar siempre la rama if). Si el "archivo" es un directorio, la prueba -f fallará y el comando táctil no cambiará nada.
mi acercamiento
#!/bin/sh
# input might contains spaces and other characters
FILEPATH="/tmp/some where/the file.blah"
# extract the file + dir names
FILE="`basename "${FILEPATH}"`"
DIR="`dirname "${FILEPATH}"`"
# create the dir, then the file
mkdir -p "${DIR}" && touch "${DIR}/${FILE}"
# show result
ls -l "$FILEPATH"
salida
./dofile.sh
-rw-r--r-- 1 jmullee jmullee 0 Nov 15 21:23 /tmp/some where/the file.blah
.