shell脚本传递文件名并运行

时间:2016-05-26 19:58:49

标签: linux bash shell sed

我有文件名列表file1,file2,file3
我想在脚本中传递这些文件名并删除特殊字符

我准备了sed命令来删除特殊字符

sed  -i -e 's/^B/,/g' /home/data/nfiledata/ 
hdfs dfs -put -f /home/data/nfiledata/*  user/sai/table1/nfiledata/
gzip  /home/data/nfiledata/*
sed  -i -e 's/^B/,/g' /home/data/marginfile/  
hdfs dfs -put -f /home/data/marginfile/*  user/sai/table2/marginfile/
gzip  /home/data/marginfile/*
sed  -i -e 's/^B/,/g' /home/data/calldata/  
hdfs dfs -put -f /home/data/calldata/*  user/sai/table3/calldata/
gzip  /home/data/calldata/*

我的问题是,不是多次写同一个命令,我可以在一个命令中编写并使用Shell脚本循环每个文件的进程

nfile = (nfiledata,margindata, calldata)
while IFS= read -r nfile
do
  sed  -i -e 's//,/g' /home/data/$nfile/
  hdfs dfs -put -f /home/data/$nfile/*  user/sai/table$/$nfile/
  gzip  /home/data/$nfile/*
done < "home/data/$nfile"

2 个答案:

答案 0 :(得分:1)

回答原始版本的问题

可以通过一次调用将相同的sed命令应用于编辑多个文件:

sed  -i -e 's/old/new/g' /home/data/file1 /home/data/file2 /home/data/file3

另外,如果文件名确实那么简单,那么可以使用大括号扩展

sed  -i -e 's/old/new/g' /home/data/file{1..3}

或者,

sed  -i -e 's/old/new/g' /home/data/file[123]

或者,如果没有其他类似命名的文件要排除,路径名扩展可能就足够了:

sed  -i -e 's/old/new/g' /home/data/file?

真实文件名示例

sed  -i -e 's/old/new/g' nfile_dat fileidentifier margindata calldata

答案 1 :(得分:1)

for循环,而非while read循环,此处适用:

nfile=(file1 file2 file3)
for f in "${nfile[@]}"; do
  sed  -i -e 's/^B/,/g' /home/data/"$f"/ # should this be "$f"/* ?
  hdfs dfs -put -f /home/data/"$f"/*  user/sai/table1/"$f"/
  gzip /home/data/"$f"/*
done

值得注意的组成部分:

  • 作业不得在=周围留出空格。逗号不是bash中数组语法的一部分 - 未引用的,未转义的空格在其他地方充当分隔符。
  • $f之类的扩展必须在双引号内才能安全执行(没有字符串拆分或通配)。
  • 全球范围扩展,例如*,必须在引号之外才能兑现。