Ubuntu에서 매우 간단한 스크립트를 작성하여 파일 이름이나 디렉토리를 전달하고 파일 일 때 특정 작업을 수행 할 수 있으며 디렉토리 일 때 다른 작업을 수행 할 수 있습니다. 내가 겪고있는 문제는 디렉토리 이름 또는 파일도 공백이나 다른 이스케이프 가능한 문자가 이름에있을 때입니다.
아래에 기본 코드가 나와 있으며 몇 가지 테스트가 있습니다.
#!/bin/bash
PASSED=$1
if [ -d "${PASSED}" ] ; then
echo "$PASSED is a directory";
else
if [ -f "${PASSED}" ]; then
echo "${PASSED} is a file";
else
echo "${PASSED} is not valid";
exit 1
fi
fi
출력은 다음과 같습니다.
andy@server~ $ ./scripts/testmove.sh /home/andy/
/home/andy/ is a directory
andy@server~ $ ./scripts/testmove.sh /home/andy/blah.txt
/home/andy/blah.txt is a file
andy@server~ $ ./scripts/testmove.sh /home/andy/blah\ with\ a\ space.txt
/home/andy/blah with a space.txt is not valid
andy@server~ $ ./scripts/testmove.sh /home/andy\ with\ a\ space/
/home/andy with a space/ is not valid
이러한 경로는 모두 유효하며 존재합니다.
답변
작동합니다. 왜 실패하는지 잘 모르겠습니다. 변수를 올바르게 인용하고 있습니다. 이 스크립트를 double과 함께 사용하면 어떻게됩니까 [[
]]
?
if [[ -d $PASSED ]]; then
echo "$PASSED is a directory"
elif [[ -f $PASSED ]]; then
echo "$PASSED is a file"
else
echo "$PASSED is not valid"
exit 1
fi
대괄호는에 대한 bash 확장 [ ]
입니다. 공백을 포함하더라도 변수를 인용 할 필요는 없습니다.
시도해 볼만한 가치가 있습니다 : -e
경로가 어떤 유형의 파일인지 테스트하지 않고 경로가 존재하는지 테스트하십시오.
답변
최소한 덥수룩 한 나무없이 코드를 작성하십시오.
#!/bin/bash
PASSED=$1
if [ -d "${PASSED}" ]
then echo "${PASSED} is a directory";
elif [ -f "${PASSED}" ]
then echo "${PASSED} is a file";
else echo "${PASSED} is not valid";
exit 1
fi
파일 “xx.sh”에 넣고 “xx sh”파일을 만들어 실행하면 다음과 같은 결과가 나타납니다.
$ cp /dev/null "xx sh"
$ for file in . xx*; do sh "$file"; done
. is a directory
xx sh is a file
xx.sh is a file
$
문제가 있다고 판단되면 다음을 추가하여 스크립트를 디버깅해야합니다.
ls -l "${PASSED}"
그러면 ls
스크립트에 전달한 이름에 대한 생각 이 표시 됩니다.
답변
“file”명령을 사용하면 다음에 유용 할 수 있습니다.
#!/bin/bash
check_file(){
if [ -z "${1}" ] ;then
echo "Please input something"
return;
fi
f="${1}"
result="$(file $f)"
if [[ $result == *"cannot open"* ]] ;then
echo "NO FILE FOUND ($result) ";
elif [[ $result == *"directory"* ]] ;then
echo "DIRECTORY FOUND ($result) ";
else
echo "FILE FOUND ($result) ";
fi
}
check_file "${1}"
출력 예 :
$ ./f.bash login
DIRECTORY FOUND (login: directory)
$ ./f.bash ldasdas
NO FILE FOUND (ldasdas: cannot open `ldasdas' (No such file or directory))
$ ./f.bash evil.php
FILE FOUND (evil.php: PHP script, ASCII text)
참고 : 위의 답변은 작동하지만 먼저 유효한 파일을 확인하여 이상한 상황에 도움이되도록 -s를 사용할 수 있습니다.
#!/bin/bash
check_file(){
local file="${1}"
[[ -s "${file}" ]] || { echo "is not valid"; return; }
[[ -d "${file}" ]] && { echo "is a directory"; return; }
[[ -f "${file}" ]] && { echo "is a file"; return; }
}
check_file ${1}
답변
사용 -f
및 -d
켜기 /bin/test
:
F_NAME="${1}"
if test -f "${F_NAME}"
then
echo "${F_NAME} is a file"
elif test -d "${F_NAME}"
then
echo "${F_NAME} is a directory"
else
echo "${F_NAME} is not valid"
fi
답변
보다 우아한 솔루션
echo "Enter the file name"
read x
if [ -f $x ]
then
echo "This is a regular file"
else
echo "This is a directory"
fi
답변
function check_file_path(){
[ -f "$1" ] && return
[ -d "$1" ] && return
return 1
}
check_file_path $path_or_file
답변
이것은 작동해야합니다.
#!/bin/bash
echo "Enter your Path:"
read a
if [[ -d $a ]]; then
echo "$a is a Dir"
elif [[ -f $a ]]; then
echo "$a is the File"
else
echo "Invalid path"
fi