2017-10-16 91 views
1

我有一个bash脚本myscript.sh。 我的意思是从其中调用另一个脚本,命令或内置函数,例如diff。 我的意思是将选项传递给myscript.sh,其中一些在调用时会传递给diff将在bash脚本中收到的选项传递给被调用的脚本,命令或内置

我实现了这是通过getopt设置选项字符串optstring,然后使用

eval "diff ${optstring} ${file} ${TRG_DIR}/${filebase2}" 

到目前为止,它的工作,但我不知道这是容易传递参数时,问题的方式与通配符等无论如何,...

有没有更好的方式来做到这一点?


我成立 optstring的方式是

set -o errexit -o noclobber -o nounset -o pipefail 
params="$(getopt -o qy --long brief,side-by-side,suppress-common-lines --name "$0" -- "[email protected]")" 

if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi 

echo params=$params 
echo [email protected] 

eval set -- "$params" 

optstring="" 
# These variables are likely not needed 
brief=false 
sbs=false 
scl=false 

#while false ; do 
while true ; do 
    case "$1" in 
     -q|--brief) 
      optstring=${optstring}" -q" 
      brief=true 
      echo "brief" 
      shift 
      ;; 
     -y|--side-by-side) 
      optstring=${optstring}" -y" 
      sbs=true 
      echo "side-by-side" 
      shift 
      ;; 
     --suppress-common-lines) 
      optstring=${optstring}" --suppress-common-lines" 
      scl=true 
      echo "suppress-common-lines" 
      shift 
      ;; 
     --) 
      shift 
      break 
      ;; 
     *) 
      echo "Not implemented: $1" >&2 
      exit 1 
      ;; 
    esac 
done 
echo optstring=${optstring} 

回答

2

使用数组。数组可以用空格处理多字参数。初始化一个空数组:

options=() 

要追加的选项,这样做:

options+=(--suppress-common-lines) 

然后终于可以摆脱eval的,当你调用diff,只是称之为正常。确保所有报价中的情况,可变膨胀的他们有空白:

diff "${options[@]}" "$file" "$TRG_DIR/$filebase2" 
+0

我发现,当没有选择,我得到的错误'选项[@]:绑定variable'。我怎样才能摆脱它? –

+0

https://stackoverflow.com/questions/7577052/bash-empty-array-expansion-with-set-u解决了这个问题。 –

相关问题