【发布时间】:2015-12-31 03:19:49
【问题描述】:
TL;DR:
为什么当myscript 具有var=$1 时不调用./myscript foo* 与使用硬编码的var=foo* 调用./myscript 相同?
更长的形式
我在编写的 bash 脚本中遇到了一个奇怪的问题。我相信有一个简单的解释,但我想不通。
我正在尝试传递一个命令行参数,以便在脚本中分配为变量。
我希望脚本允许 2 个命令行参数,如下所示:
$ bash my_bash_script.bash args1 args2
在我的脚本中,我分配了如下变量:
ARGS1=$1
ARGS2=$2
Args 1 是要添加到输出文件的字符串描述符。
Args 2 是一组目录:“dir1, dir2, dir3”,我将其传递为dir*
当我在脚本中将 dir* 分配给 ARGS2 时,它可以正常工作,但是当我将 dir* 作为第二个命令行参数传递时,它只在 dir* 的通配符扩展中包含 dir1。
我认为这与 shell 如何处理通配符有关(即使作为 args 传递),但我不太明白。
任何帮助将不胜感激。
环境/用途
我有一组目录:
dir_1_y_map, dir_1_x_map, dir_2_y_map, dir_2_x_map,
... dir_10_y_map, dir_10_x_map...
在这些目录中,我尝试通过*.status 和".report.txt" 通过*report.txt 访问扩展名为".status" 的文件。
我想将dir_*_map 作为第二个参数传递给脚本并将其存储在变量ARGS2 中,然后使用它在每个目录中搜索".status" 和".report" 文件。
问题是从命令行传递dir_*_map 不会给出目录列表,而只是列表中的第一项。如果我在脚本中分配变量ARGS2=dir_*_map,它会按我的意图工作。
解决方法:引用
事实证明,在引号中传递第二个参数允许通配符扩展对"dir_*_map" 正常工作
#!/usr/bin/env bash
ARGS1=$1
ARGS2=$2
touch $ARGS1".extension"
for i in /$ARGS2/*.status
do
grep -e "string" $i >> $ARGS1".extension"
done
这是一个脚本调用示例:
sh ~/path/to/script descriptor "dir_*_map"
我不完全理解何时/为什么必须在引号中传递某些参数,但我认为这与 for 循环中的通配符扩展有关。
【问题讨论】:
-
将脚本中的第一行用作
#!/bin/bash,而不是调用bash myscript arg1 ...。可能无法解决您的问题,但不是好的做法。祝你好运。 -
你真的需要给我们最小的示例程序(集)来说明你的问题。您可能只需要使用
"$ARG1"和$ARG2来解决您的问题,但是如果没有真正的证据证明发生了什么,我们只能推测,嗯? ;-) 请编辑你的 Q,而不是在 cmets 中创建一条消息链。祝你好运。 -
谢谢,我在我的代码示例中进行了编辑。
-
好节目,很高兴您更新了您的 Q。现在我们可以提供帮助。但是当
ARGS2=dir1, dir2, dir3可能与for i in /{$ARGS2}/*.status一起使用时,您的for i in /$ARGS2/*.status;做 并且您需要删除dir1,dir2,dir3之类的空格。会和这个一起吃的,你也试试。祝你好运。 -
学习通过
http://shellcheck.net运行代码,您会发现for行缺少;do并且for i中的i从未在您的块中使用的代码。你想在哪里使用grep $arg1 $i/....?我猜?