내 Bash 스크립트가 구문 오류를 반환하는 이유는 무엇입니까? [복사]

내 Bash 스크립트가 구문 오류를 반환하는 이유는 무엇입니까? [복사]

폴더의 가장 최근 파일을 반복하여 명령을 실행하는 스크립트를 작성 중입니다.

#!/bin/bash
cd /home/Downloads
recent_files = ($(ls -t | head -20))
for file in "${recent_files[@]}"
do
    ./cmd $file
done

다음 구문 오류가 발생합니다.

line 3: syntax error near unexpected token `('
line 3: `recent_files = ($(\ls -t | head -20))'

답변1

Bash 변수 할당 체계는 var=value추가 공간을 허용하지 않습니다.

이를 제거하면 ls -t | head -20출력이 배열로 올바르게 할당됩니다.

따라서 스크립트는 다음과 같아야 합니다.

#!/bin/bash
cd /home/Downloads
recent_files=($(ls -t | head -20))
for file in "${recent_files[@]}"
do
    ./cmd $file
done

답변2

출력을 변수에 저장할 필요가 전혀 없습니다.

cd /home/Downloads
command ls -t | head -20 | while read -r file; do
    ./cmd "$file"
done

심지어

command ls -t | head -20 | xargs -L 1 ./cmd

더 안전한 작업 방법은 를 사용하는 것입니다 stat. 여전히 개행 문자가 포함된 파일 이름으로부터 보호되지는 않습니다.

stat -c "%Y %n" * | sort -rn | head -20 | cut -d" " -f2- | xargs -L 1 ./cmd

확실히 말하자면, find널 바이트를 처리하려면 GNU 도구가 필요할 수도 있습니다.

find . "${find_options[@]}" -printf '%T@ %p\0' | 
sort -zrn |
xargs -0 -L 1 sh -c './cmd "$(echo "$0" | sed "1s/^[0-9.]\\+ //")"'

find_options배열은 필터링 지침을 추가하기 위한 자리 표시자로 사용될 수 있습니다.

find_options=( -type f )
find_options+=( -maxdepth 1 )
find_options+=( -name '*.txt' )

등.

답변3

등호 주위의 공백을 제거해야 합니다.

recent_files=($(ls -t | head -20))

그러면 작동할 것입니다.

답변4

오류 메시지에 모든 것이 나와 있습니다. 그러나 나중에 이러한 문제를 해결하는 데 도움이 되도록 할 수 있는 몇 가지 작업이 있습니다.

  1. 다음과 같이 오류를 발생시키는 줄을 주석 처리합니다.
최근 파일 = ($(ls -t | 헤더-20))

그리고 달리다

배쉬 -n myScript.sh

스크립트에 오류가 있는지 확인합니다.

  1. 다음과 같은 코드 블록을 주석 처리합니다.

    : << 'EOF'
    lines
    of
    code
    EOF
    

그리고 달리다

배쉬 -n myScript.sh

이 방법을 사용하면 스크립트에서 잘못된 줄을 확대할 수 있습니다.

귀하의 특정 질문으로 돌아가서, 많은 사람들이 이미 문제의 원인이 무엇인지, 즉 =로고 주변의 공백에 답변했습니다.

관련 정보