Bash 在不更改脚本中的名称的情况下提供文件
开始时,我有一个文件.txt,其中包含一些信息,我将使用grep命令获取这些信息,如脚本中所示 我想要的是给脚本我想要的文件,而不是file.txt,但是在脚本中每次都不更改文件名,例如,如果文件名为Me.txt,我不想进入脚本并在每个grep命令中写入Me.txt,尤其是如果我有几十个订单 有办法做到这一点吗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
#!/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}}