Bash脚本中的for循环在处理第一行后退出
在终端中运行此选项可以正常运行:Bash脚本中的for循环在处理第一行后退出,bash,for-loop,scripting,Bash,For Loop,Scripting,在终端中运行此选项可以正常运行: for a in *.pdf; do mv "$a" "$a".tmp; done 在bash脚本中运行此操作(#!/bin/bash) …并传递参数*.pdf,即/myscript*.pdf,脚本只处理目录中的第一个文件。通过将mv更改为echo进行测试,可以显示相同的情况 有没有解释为什么会这样,以及我如何能够处理所有文件匹配?谢谢 当你跑步时 ./myscript *.pdf 首先发生的事情是,*.pdf被扩展到所有匹配项。所以你实际上称之为 ./my
for a in *.pdf; do mv "$a" "$a".tmp; done
在bash脚本中运行此操作(#!/bin/bash
)
…并传递参数*.pdf
,即/myscript*.pdf
,脚本只处理目录中的第一个文件。通过将mv
更改为echo
进行测试,可以显示相同的情况
有没有解释为什么会这样,以及我如何能够处理所有文件匹配?谢谢 当你跑步时
./myscript *.pdf
首先发生的事情是,*.pdf
被扩展到所有匹配项。所以你实际上称之为
./myscript file1.pdf file2.pdf file3.pdf
试一试
这将循环所有位置参数。问题在于,
$1
只是第一个参数(这里是第一个pdf)。要循环遍历所有参数,请使用:
for var in "$@"; do
do mv "$var" "$var".tmp
done
$@
是一个bash内置变量,一个包含所有命令行参数的数组。所以你知道,还有$*
,这是:
所有位置参数,视为单个单词()
shell将已经展开
*.pdf
,并将pdf列表传递给myscript。如果要将字符串*.pdf
传递给脚本,则必须引用或转义它/myscript“*.pdf”
应该可以很好地工作。谢谢
for a; do
mv "$a" "$a".tmp
done
for var in "$@"; do
do mv "$var" "$var".tmp
done