创建复杂linux命令的bash脚本

时间:2010-08-18 15:08:19

标签: 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}'

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

2 个答案:

答案 0 :(得分: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}'

使用命令chmod +x mytask.sh

确保此文件可执行

您可以像sh myscript.sh 30 myfile.sh./myscript.sh 30 myfile.sh

一样调用它

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

关于参数有效性检查:

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

答案 1 :(得分:1)

要以任何顺序接受文件名和列号,您需要使用选项开关。 Bash的getopts允许您指定和处理选项,以便您可以使用scriptname -f filename -c 12scriptname -c 12 -f filename来调用脚本。

#!/bin/bash

options=":f:c:"
while getopts $options option
do
    case $option in
        f)
            filename=$OPTARG
            ;;
        c)
            col_num=$OPTARG
            ;;
        \?)
            usage_function    # not shown
            exit 1
            ;;
        *)
            echo "Invalid option"
            usage_function
            exit 1
            ;;
    esac
done
shift $((OPTIND - 1))
if [[ -z $filename || -z $col_num ]]
then
    echo "Missing option"
    usage_function
    exit 1
fi
if [[ $col_num == *[^0-9]* ]]
then
    echo "Invalid integer"
    usage_function
    exit 1
fi
# other checks
cut -f 10  $col_num "$filename" | ...