为什么我的 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))

并运行

bash -n myScript.sh

这将检查脚本中的错误。

  1. 注释掉一行代码块,如下所示:

    : << 'EOF'
    lines
    of
    code
    EOF
    

并运行

bash -n myScript.sh

使用这种方法,您将能够放大脚本中的错误行。

回到您的具体问题,许多人已经回答了导致该问题的原因 -=标志周围的空格。

相关内容