for循环无法区分*语法

for循环无法区分*语法
set -x 
for f in ~/1/2/*/*_1.txt; do
subdir="${f%/*}"
pushd "$subdir" &>/dev/null
file="${f##*/}"

expTool INPUT1= "${f##*/}" INPUT2= "${f%_1.txt}_2.txt OUTPUT1= "${f%_1.txt}_3.txt" OUTPUT2= "${f%_2.txt}_4.txt"
done

expTool error: [Errno 2] No such file or directory: '*_1.txt'

我已经减去了引文,但这是行不通的。

编辑:使用 set -x

+for f in '/User/admin/1/2/*/*_1.txt'
+subdir='/User/admin/1/2/*'
+pushd '/User/admin/1/2/*'
+file='*_1.txt'
+expTool INPUT= '*_1.txt' OUTPUT= '${f%_1.txt}_2.txt'

所以看起来“*”语法没有被注册为通配符(?)。我使用的是 Mac OSX 10.8.6。

答案1

要么您set -f在脚本中较早运行,这会禁用通配符扩展,要么没有匹配的文件。如果没有匹配文件,则模式保持不变,因此 for 循环在一个未更改模式的元素上运行。在 bash 中,您可以使用shopt -s nullglob来创建不匹配的模式,而不是扩展到空列表。

答案2

我不确定我是否理解你的代码,

for f in ~/1/2/*/*_1.txt; do
  fdn="${f%/*}"
  fbn1="${f##*/}"
  fbn2="${fbn1//_1/_2}"
  fbn3="${fbn1//_1/_3}"
  fbn4="${fbn1//_1/_4}"
  expTool INPUT1= "$fdn/$fbn1" INPUT2= "$fdn/$fbn2" OUTPUT1= "$fdn/$fbn3" OUTPUT2= "$fdn/$fbn4"
done

如果我是主题请告诉我,我删除我的答案!

相关内容