我几乎没有长命令,我将每天使用它。所以我觉得最好有一个bash脚本,我可以传递参数,从而节省输入。我想这是Linux的常态,但我对它有点新意。有人可以告诉我如何做到这一点。一个例子是以下命令
cut -f <column_number> <filename> | sort | uniq -c |
sort -r -k1 -n | awk '{printf "%-15s %-10d\n", $2,$1}'
所以我希望在脚本中我可以传递文件名和列号(最好以任何顺序)并获得所需的输出,而不必每次都输入整个内容。
答案 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 :(得分:1)
要以任何顺序接受文件名和列号,您需要使用选项开关。 Bash的getopts
允许您指定和处理选项,以便您可以使用scriptname -f filename -c 12
或scriptname -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" | ...