2015-09-28 91 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