我正在编写一个脚本,该脚本循环进入文件夹中的最近文件并执行命令...
#!/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))
并运行
bash -n myScript.sh
这将检查脚本中的错误。
注释掉一行代码块,如下所示:
: << 'EOF' lines of code EOF
并运行
bash -n myScript.sh
使用这种方法,您将能够放大脚本中的错误行。
回到您的具体问题,许多人已经回答了导致该问题的原因 -=
标志周围的空格。