폴더의 가장 최근 파일을 반복하여 명령을 실행하는 스크립트를 작성 중입니다.
#!/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
오류 메시지에 모든 것이 나와 있습니다. 그러나 나중에 이러한 문제를 해결하는 데 도움이 되도록 할 수 있는 몇 가지 작업이 있습니다.
- 다음과 같이 오류를 발생시키는 줄을 주석 처리합니다.
최근 파일 = ($(ls -t | 헤더-20))
그리고 달리다
배쉬 -n myScript.sh
스크립트에 오류가 있는지 확인합니다.
다음과 같은 코드 블록을 주석 처리합니다.
: << 'EOF' lines of code EOF
그리고 달리다
배쉬 -n myScript.sh
이 방법을 사용하면 스크립트에서 잘못된 줄을 확대할 수 있습니다.
귀하의 특정 질문으로 돌아가서, 많은 사람들이 이미 문제의 원인이 무엇인지, 즉 =
로고 주변의 공백에 답변했습니다.