Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本中的for循环在处理第一行后退出_Bash_For Loop_Scripting - Fatal编程技术网

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