自动化命令行

时间:2015-04-13 20:00:09

标签: bash automation

我执行以下cmd行,现在我需要将它放在我可以调用的脚本中,并将file1,file2,file3作为参数传递。

sort file1.csv > file1.csv.sorted
sort file2.csv > file2.csv.sorted 
diff --speed-large-files \
  file1.csv.sorted \
  file2.csv.sorted \
  > file3.difftmp
rm file1.csv.sorted
rm file2.csv.sorted

我曾尝试创建bash脚本,但是以下eval无效:

s="diff --speed-large-files $file1.csv.sorted $file2.csv.sorted > $file3"
eval s

我不一定需要创建一个bash脚本,但我需要自动化这个过程,以便其他进程可以调用它并传递参数。

3 个答案:

答案 0 :(得分:3)

当您使用bash时,您可以利用流程替换:

#!/bin/bash
diff --speed-large-files <(sort "$1") <(sort "$2")

您可以将两个文件名作为参数传递给脚本。这样可以避免创建临时文件和手动清理。

答案 1 :(得分:3)

不要在这里使用eval;一个简单的功能就足够了:

filediff() {
   sort "$1".csv > "$1".csv.sorted
   sort "$2".csv > "$2".csv.sorted 
   diff --speed-large-files "$1".csv.sorted "$2".csv.sorted > "$3".difftmp
   rm "$1".csv.sorted
   rm "$2".csv.sorted
}

正如Tom Fenech建议的那样,您也可以使用流程替换并避免创建临时文件。

答案 2 :(得分:0)

我想,你可以做到

k=$(s)

因此k是一个变量,其中存储了从命令s返回的结果。如果要将字符串用作s命令,请执行$("cmd")