如何在bash脚本中创建参数变量

时间:2019-01-28 19:33:38

标签: bash unix

我正在尝试编写一个脚本,以便可以识别子目录中第n个最大文件的字符数。 我试图将n和子目录的名称分配给$ 1,$ 2之类的参数。

Current directory: Greetings
   Sub-directory: language_files, others
     Sub-directory: English, German, French
          Files: Goodmorning.csv, Goodafternoon.csv, Goodevening.csv ….

我将位于目录“ Greetings”中,同时我指示子目录(英语,德语,法语),它将显示所指示子目录中的第n个最大文件,并计算字符数。

例如,如果我试图找出英语第二大文件的字符数,则可以这样做:

langs=$1
n=$2
for langs in language_files/;
 Do count=$(find language_files/$1 name "*.csv" | wc -m | head -n -1 | sort -n -r | sed -n $2(p))
Done | echo "The file has $count bytes!"

我想要的结果是:

$ ./script1.sh English 2
The file has 1100 bytes!

所有问题的主要问题是我不了解bash脚本中的变量和循环是如何工作的。

2 个答案:

答案 0 :(得分:1)

无需循环

find language_files/"$1" -name "*.csv" | xargs wc -m | sort -nr | sed -n "$2{p;q}"

对于字节计数,您应该使用-c,因为-m用于字符计数(可能与您相同)。

无论如何,您都不会在脚本中使用循环变量。

答案 1 :(得分:0)

重击循环很有趣。有时间的话,我们鼓励您进一步了解它们。但是,此特定问题可能不需要循环。设置lang(如果需要,可以将其命名为langs)和n,然后尝试以下操作:

count=$(stat -c'%s %n' language_files/$lang/* | sort -nr | head -n$n | tail -n1 | sed -re 's/^[[:space:]]*([[:digit:]]+).*/\1/')

这应该为您提供所需的$ count。然后您可以根据自己的喜好echo

EXPLANATION

如果您想了解其工作原理:

  • stat命令输出有关一个或多个命名文件的各种统计信息,在这种情况下,%s是文件的大小,%n是文件名。
  • headtail分别输出文件的第一行和最后几行。他们一起从文件中选择特定的行
  • sed命令将屏蔽该行的特定部分。 (如果愿意,可以改用cut。)

如果您想变得更聪明,那么可以像@karafka一样进行优化。