2015-09-28 176 views
2

解析參數我想編寫一個bash腳本:bash腳本在Linux中

schedsim.sh [-h] [-c x] -i pathfile 

其中:

•-h:打印當前用戶名。

•-c x:獲取選項參數x並打印出(x + 1)。如果未找到參數,則打印默認值爲1.

•-i pathfile:打印pathfile的大小。 pathfile是必需的參數。如果未找到任何參數,則輸出錯誤消息。

這是我迄今所做的:

x="" 
path="" 
while getopts ":hc:i:" Option 
do 
case $Option in 
h) echo -e "$USER\n" 
;; 
c) x=$optarg+1 
;; 
i) path=$(wc -c <"$optarg") 
;; 
esac 
done 

if [ -z "$x"] 
then 
echo -e "$x\n" 
else 
echo 1 
fi 

if [ -z "$path"] 
then 
echo $path 
else 
echo "Error Message" 
exit 1 
fi 

如何完成選項參數,所需參數的部分和錯誤消息的一部分?

+0

也許而不是循環,你可以得到所有的值,並將它們設置爲變量。然後,在做任何其他處理之前,您可以檢查是否通過了'i':'if [-z「$ i」] ...',如果不是,則打印一個用法。 – Justin

+0

我編輯過,是嗎? – Forrest

回答

2

甲重寫:

while getopts ":hc:i:" Option; do 
    case $Option in 
     h) echo "$USER" 
      ;; 
     c) x=$(($OPTARG + 1)) 
      ;; 
     i) if [[ -f $OPTARG ]]; then 
       size=$(wc -c <"$OPTARG") 
      else 
       echo "error: no such file: $OPTARG" 
       exit 1 
      fi 
      ;; 
    esac 
done 

if [[ -z $x ]]; then 
    echo "you used -c: the result is $x" 
fi 

if [[ -z $size ]]; then 
    echo "you used -i: the file size is $size" 
fi 

注:

  • OPTARG必須是大寫。
  • 需要$((...))對於bash算術
  • 檢查文件是否存在使用前
  • 使用一個明智的文件名(path並不代表文件的大小)
  • 必須是空間]
  • echo -e "value\n"是太多的工作:你只是想echo "value"除非你要處理轉義序列的值:

    $ var="foo\tbar\rbaz" 
    $ echo "$var" 
    foo\tbar\rbaz 
    $ echo -e "$var\n" 
    baz bar 
    
    $ 
    

更新:回覆評論:簡化和更完整的選項處理;擴展錯誤處理。

#!/bin/bash 
declare -A given=([c]=false [i]=false) 
x=0 
path="" 

while getopts ":hc:i:" Option; do 
    case $Option in 
     h) echo "$USER" 
      ;; 
     c) x=$OPTARG 
      given[c]=true 
      ;; 
     i) path=$OPTARG 
      given[i]=true 
      ;; 
     :) echo "error: missing argument for option -$OPTARG" 
      exit 1 
      ;; 
     *) echo "error: unknown option: -$OPTARG" 
      exit 1 
      ;; 
    esac 
done 

# handle $x 
if [[ ! $x =~ ^[+-]?[[:digit:]]+$ ]]; then 
    echo "error: your argument to -c is not an integer" 
    exit 1 
fi 
if ! ${given[c]}; then 
    printf "using the default value: " 
fi 
echo $((10#$x + 1)) 

# handle $path 
if ! ${given[i]}; then 
    echo "error: missing mandatory option: -i path" 
    exit 1 
fi 
if ! [[ -f "$path" ]]; then 
    echo "error: no such file: $path" 
    exit 1 
fi 
echo "size of '$path' is $(stat -c %s "$path")" 
+0

請注意,你應該檢查'-c'的參數是否是一個數字(否則它會受到任意代碼執行),並且可能預先使用'10#'來避免August錯誤。 –

+0

@gniourf_gniourf如何檢查它? – Forrest

+0

@DươngAnhKhoa:類似於[[[$ OPTARG = +([[:digit:]])]] || || {回聲「參數-c不是數字」;出口1; }'。 –

0

我認爲你要找的是在bash中的「參數解析」。請看這個優秀的答案:https://stackoverflow.com/a/14203146/3380671

關於這個必需/可選部分:初始化一個空字符串的變量,並在參數解析後檢查字符串的長度。

FILE_PATH="" 
# Do the argument parsing here ... 
# And then: 
if [ -z "$FILE_PATH" ] 
then 
    echo "Please specify a path. Aborting." 
    exit 1 
fi 
+0

我編輯它。我是對的嗎? – Forrest