"$i | sed"가 작동하지 않는 이유는 무엇입니까?

"$i | sed"가 작동하지 않는 이유는 무엇입니까?

나는 이 코드를 가지고 있습니다 :

if [ $i | sed -e "s/^.*\(.\)$/\1/" = "/" ]
then
    echo "folder"
else
    echo "file"
fi

$i그런게 어디 있나요

app4/

위 코드는 문자열의 마지막 문자를 가져와서 그것이 슬래시( /)인지 확인하도록 되어 있지만 다음과 같은 내용을 알려줍니다.

./str: 12행:=app4/: 파일이나 디렉터리가 존재하지 않습니다.

이 문제를 어떻게 해결할 수 있나요?

답변1

$i실행하려는 정확한 명령을 보려면 in 값을 바꿀 수 있습니다 .

app4/ | sed -e "s/^.*\(.\)$/\1/"

app4/명령이 아니기 때문에 작동하지 않습니다 . 입력을 파이프 app4/하려고 하므로 sed출력을 사용해야 합니다 app4/.

echo app4/ | sed -e "s/^.*\(.\)$/\1/"

sed이것은 작동하지만 실제로 이를 위해 사용할 필요는 없습니다 . bash문자열 조작 도구가 많이 있습니다. 예를 들어, ${i#}길이를 제공 $i하고 ${i:j}처음부터 부분 문자열을 제공하므로 j마지막 ${i:$((${i#}-1))}문자를 제공합니다.

당신이 시도하는 것을 달성하는 가장 쉬운 방법은 아마도 다음을 사용하는 것입니다 . 이것은 반환되지만 ${i%/}끝에서 $ia를 제거합니다 ./

$ i="app4"; echo ${i%/}
app4
$ i="app4/"; echo ${i%/}
app4

그러므로:

if [ "${i%/}" = "$i" ]
then
    echo "file"
else
    echo "folder"
fi

그러나 만약 당신이진짜$i유효한 디렉토리인지 확인하려면 다음을 사용할 수 있습니다.

if [ -d "$i" ]

답변2

변수가 /로 끝나는지 확인하는 가장 간단한 방법은 다음과 같습니다.

[[ $i = */ ]]

..Johan이 말했듯이 존재하는지 확인하고 존재하지 않으면 생성할 수 있습니다. 그러나 다음과 같이 올바르게 인용해야 합니다.

if [[ ! -d $i ]]; then
    mkdir -p "$i" || exit 1
fi

[[ .. ]] 내부의 확장을 인용할 필요가 없습니다. 확장은 더 큰 실용성과 속도와 함께 사용을 더 쉽게 만들어줍니다. mkdir의 인수를 인용해야 합니다.

관련 정보