Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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 在不更改脚本中的名称的情况下提供文件_Bash_Shell_Awk_Sh_Script - Fatal编程技术网

Bash 在不更改脚本中的名称的情况下提供文件

Bash 在不更改脚本中的名称的情况下提供文件,bash,shell,awk,sh,script,Bash,Shell,Awk,Sh,Script,开始时,我有一个文件.txt,其中包含一些信息,我将使用grep命令获取这些信息,如脚本中所示 我想要的是给脚本我想要的文件,而不是file.txt,但是在脚本中每次都不更改文件名,例如,如果文件名为Me.txt,我不想进入脚本并在每个grep命令中写入Me.txt,尤其是如果我有几十个订单 有办法做到这一点吗 #!/bin/bash grep teste file.txt > testline.txt awk '{print $2}' testline.txt > test.tx

开始时,我有一个文件.txt,其中包含一些信息,我将使用grep命令获取这些信息,如脚本中所示

我想要的是给脚本我想要的文件,而不是file.txt,但是在脚本中每次都不更改文件名,例如,如果文件名为Me.txt,我不想进入脚本并在每个grep命令中写入Me.txt,尤其是如果我有几十个订单

有办法做到这一点吗

#!/bin/bash
grep teste file.txt > testline.txt
awk  '{print $2}' testline.txt > test.txt
echo '#' 
echo '#'


grep remote file.txt > remoteline.txt
awk  '{print $3}' remoteline.txt > remote.txt
echo '#' 
echo '#'


grep adresse file.txt > adresseline.txt
awk  '{print $2}' adresseline.txt > adresse.txt

您应该将文件名作为命令行参数传递,以便可以像这样调用脚本:

script <filename>
顺便说一句,你不需要两个不同的文件来实现你想要的,你只需将
grep
的输出直接导入
awk
,例如:

grep teste "${filename}" | awk '{print $2}' > test.txt
但是,再一次,
awk
可以自己进行正则表达式匹配,将其简化为一个命令:

awk '/teste/ {print $2}' "${filename}" > test.txt

正如许多贡献者所建议的那样,使用一个参数当然是显而易见的方法,也是在这种情况下通常采用的方法,因此我想扩展这个想法:

如果你像我一样天真地做

filename=$1
您必须在每次调用时提供名称。您可以通过为缺少参数的情况提供默认值来对此进行改进:

filename=${1:-file.txt}
但有时您会遇到这样的情况:在一段时间内(处理特定任务),您总是需要一次又一次地使用相同的文件名,而默认值恰好不是您需要的。向程序传递信息的另一种可能性是通过环境。如果将文件名设置为

filename=${MOOFOO:-file.txt}
这意味着,假设您的脚本名为
myscript.sh
,如果您通过

MOOFOO=myfile.txt myscript.sh
它使用myfile.txt,而如果您通过

myscript.sh
它使用默认的file.txt文件。您还可以在shell中设置MOOFOO,如下所示

export MOOFOO=myfile.txt
然后,即使是单独执行

myscript.sh
使用myfile.txt而不是默认的file.txt

最灵活的方法是将两者结合起来,这是我在这种情况下经常做的事情。如果你在你的脚本中

filename=${1:-${MOOFOO:-file.txt}}

它从第一个参数获取名称,但如果没有参数,则从变量MOOFOO获取名称,如果此变量也未定义,则使用file.txt作为最后一个回退。

使用文件名作为参数调用脚本。在脚本中,名称可以作为$1访问(如果您担心文件名可能包含空格,请将其放在双引号内),为了了解如何使用脚本中的参数,请参阅本文:非常感谢:)
filename=${1:-${MOOFOO:-file.txt}}