2010-08-18 82 views
2

我有幾個長期的命令,我將在每天的基礎上使用。所以我儘管有一個可以傳遞參數的bash腳本會更好,因此可以節省打字的時間。我想這是Linux的常態,但我對它很陌生。有人能告訴我怎麼做。例子是以下命令創建一個複雜的linux命令的bash腳本

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

,所以我想這在腳本中,其中i可以通過(優選以任何順序)的文件名和列號,並獲得所希望的輸出中,而不必每次鍵入整個事情的。

回答

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. 第三次檢查可確保作爲第一個參數傳遞的數字確實是一個數字。它使用正則表達式來達到這個目的。可能會有人提供更好的替代品,但這是我立即想到的。
+0

@Gopi但如果我想確保文件存在和列值是數字整數,那種事情呢? – sfactor 2010-08-18 15:17:33

+0

你可以做各種事情,看看這個指南http://tldp.org/LDP/abs/html/ – sourcerebels 2010-08-18 15:41:34

+0

@sfactor - 要確定文件存在,你需要使用一個if語句與文件switch:'if [-f testfile] then/ echo「testfile exists!」/fi'我將離開列類型測試給你。看看bash參考手冊的進一步幫助,你可以從這裏開始:http://www.faqs.org/docs/bashman/bashref_68.html – 2010-08-18 15:56:30

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" | ...