外壳扩展和位置参数

外壳扩展和位置参数


我想制作一个相当于zgrepor 的脚本bzgrep,但使用tar.

我做了两次非常相似的尝试,我想知道是否有更好的尝试,是否可以改进,或者它们会因为某种我看不到的原因而崩溃。我知道如何使用tarbzip2,但我经常在 shell 扩展方面遇到一些麻烦。

第一次使用$@

#!/bin/bash
FILE_IN="${@: -1}"; ## Take last arg (file name) 
echo "FILE_IN: $FILE_IN"; 

INPUT_PARAMS="${@%%$FILE_IN}"; ## Take all args, but last (options and pattern)
echo "INPUT_PARAMS: $INPUT_PARAMS"; 

### Here I have to treat $INPUT_FILE before using grep (skipped) ###  

grep "$INPUT_PARAMS" "$FILE_IN"; 
exit $?; 

第二个使用变量(与上面几乎相同,只有一些区别):

#!/bin/bash
ARGS="$@" 
FILE_IN="${!ARGS[@]: -1}"; ## Take last arg (file name) 

INPUT_PARAMS=${ARGS%%$FILE_IN};

### From here is identical 

它们似乎都有效,但后来我查看了脚本,bzgrep发现它要复杂得多。所以,这让我觉得我的脚本行不通。

有什么想法吗?它们可以改进吗?

答案1

如果你想存储多个参数,你需要一个数组:

file_in="${@: -1}"
input_params=("${@:1:$#-1}")

或者:

file_in="${@: -1}"
input_params=("$@")
unset 'input_params[-1]'

或者,仅使用sh语法:

n=$#
for file_in do
  shift
  [ "$((n = n - 1))" -gt 0 ] || break
  set -- "$@" "$file_in"
done
# input_params in "$@"

(所有大写变量应保留给环境变量)。

相关内容