创建复杂linux命令的bash脚本

sfa*_*tor 2 linux bash command-line

我每天都会使用很少的长命令.所以我觉得最好有一个bash脚本,我可以传递参数,从而节省输入.我想这是Linux的常态,但我对它有点新意.有人可以告诉我如何做到这一点.一个例子是以下命令

cut -f <column_number> <filename> | sort | uniq -c | 
sort -r -k1 -n | awk '{printf "%-15s %-10d\n", $2,$1}'
Run Code Online (Sandbox Code Playgroud)

所以我希望在脚本中我可以传递文件名和列号(最好以任何顺序)并获得所需的输出,而不必每次都输入整个内容.

Gop*_*opi 8

创建一个文件说myscript.sh -

#!/bin/bash
if [ $# -ne 2 ]; then 
echo Usage: myscript.sh column_number file_path
exit
fi

if ! [ -f $2 ]; then
echo File doesnt exist
exit
fi

if [ `echo $1 | grep -E ^[0-9]+$ | wc -l` -ne 1 ]; then
echo First argument must be a number
exit
fi

cut -f 10  $1 $2 | sort | uniq -c | 
sort -r -k1 -n | awk '{printf "%-15s %-10d\n", $2,$1}'
Run Code Online (Sandbox Code Playgroud)

使用命令确保此文件是可执行的 chmod +x mytask.sh

你可以像sh myscript.sh 30 myfile.sh或那样调用它./myscript.sh 30 myfile.sh

上面脚本的第一行指定了您希望执行脚本的shell.$ 1和$ 2引用第一个和第二个命令行参数.

关于参数有效性检查:

  1. 首先检查确保传递给脚本的参数正好两个.
  2. 第二次检查确保参数二指向的文件存在
  3. 第三次检查确保作为第一个参数传递的数字实际上是一个数字.它为此目的使用正则表达式.可能有人为这张支票提供了更好的替代品,但这就是我立刻想到的.