디렉터리 목록을 표시하는 Bash 스크립트에 오류가 있습니다.

디렉터리 목록을 표시하는 Bash 스크립트에 오류가 있습니다.

나는 디렉터리를 인수로 받아들이고 해당 목록, 테스트 파일 및 디렉터리를 인쇄하는 간단한 bash 스크립트(아주 처음 접합니다!)를 작성했습니다. 이것이 내가 처리하는 방법입니다.

#!/bin/bash
# Lists all files and directories (non-recursively) in a specified directory

if [ $# -gt 1 ]; then
    echo "Error. Please specify only one directory. ($#)"
    exit
fi

if [ -z $1 ]; then
    echo "No directory specified. Exiting."
    exit
fi

echo "Listing for $1:"

$dirs=`ls $1`
echo "Dirs: $dirs" # Just to confirm if all is well

# Loop through and print
for i in $dirs;
do
    if [ -f $i ]; then
        echo "File: $i"
    elif [ -d $i ]; then
        echo "Directory: $i"
    fi
done

문제는 내 for 루프에 있습니다. 이 스크립트를 실행하고 홈 디렉터리에 입력하면 다음 오류가 발생합니다.

./list_files_and_dirs.sh: line 16: =Calibre: command not found

변수와 관련된 명령 대체에서 실수를 하고 있다는 것을 알고 있지만 무엇인지는 모르겠습니다. 누군가 도와주세요!

=================업데이트===================

답변을 기반으로 입력된 새(마지막 부분) 코드는 다음과 같습니다.

dirs=`ls "$1"`
#echo "Dirs: $dirs" # Just to confirm if all is well

IFS=$'\n'

# Loop through and print
for i in $dirs;
do
    if [ -f "$i" ]; then
        echo "File: $i"
    elif [ -d "$i" ]; then
        echo "Directory: $i"
    fi
done

답변1

참고: 나는 당신이 스스로 Bash를 배우고 있다고 가정합니다. 프로덕션 환경에서는 이 코드를 사용하지 마세요. find "$directory" -maxdepth 1 -type d디렉토리와 -type f파일이 제공됩니다.

16행에 대해 불평하므로 살펴보겠습니다.

$dirs=`ls $1`

변수에 할당하려면 변수를 포함해서는 안 됩니다 $.

dirs=`ls $1`

지금 무슨 일이 일어나고 있는지는 다음과 같습니다.

  • $dirs비어 있을 수 있으므로 대체할 것이 없습니다.
  • 명령 ls이 실행되고 해당 출력이 "command"로 대체됩니다.
  • 디렉토리의 첫 번째 파일은 이며 Calibre다음 명령을 남깁니다.=Calibre x y z ...
  • =Calibre유효한 명령이 아니므로 오류가 발생합니다.

그러나 아직 그렇게 하지 않았습니다. 파일 이름에 공백이 있으면 오류가 발생합니다. 이 문제를 해결하려면 몇 가지 작업을 더 수행해야 합니다.

  • IFS=$'\n'루프 앞 어딘가에 포함 해야 합니다 for. 이렇게 하면 필드 구분 기호가 개행 문자로 설정되어 for루프가 파일을 공백이나 탭으로 분할하는 것을 방지합니다(기술적으로 파일 이름에 개행 문자도 포함되어 있으므로 이러한 상황이 발생할 가능성은 거의 없습니다). 그러한 파일을 만나더라도 심각한 문제가 발생하지는 않지만, 문제가 되는 경우를 대비하여 가능성에 주목할 가치가 있습니다.
  • -f공백이 포함된 파일 이름이 및 에 대한 여러 다른 매개변수 로 바뀌지 않도록 하려면 -d이름 주위에 따옴표를 넣어야 합니다 $i. (따라서: [ -f "$i" ][ -d "$i" ]. 공백이 있는 디렉토리를 지원하려면 $1이를 사용할 때마다 동일한 작업을 수행해야 합니다.

답변2

Marinus는 이 오류가 발생하는 이유를 설명했습니다. 여기서는 이것이 필요하지 않다는 점을 지적하고 싶습니다 ls. 이렇게 하면 그에 따른 모든 문제를 피할 수 있습니다.출력을 구문 분석. 다음을 수행할 수 있습니다.

#!/bin/bash
# Lists all files and directories (non-recursively) in a specified directory

if [ "$#" -gt 1 ]; then
    echo "Error. Please specify only one directory. ($#)"
    exit
fi

if [ -z "$1" ]; then
    echo "No directory specified. Exiting."
    exit
fi

echo "Listing for $1:"

# Loop through and print
for i in "$1"/*;
do
    if [ -f "$i" ]; then
        echo "File: $i"
    elif [ -d "$i" ]; then
        echo "Directory: $i"
    fi
done

관련 정보