我正在使用getopts built-in函数将参数解析为我的bash脚本。然后,我获取分配给每个标志的值,并在后续命令中使用。

myscript.sh的一部分:

while getopts "s:n:e" opt; do
 case $opt in
n) name=$OPTARG;;
e) area=$OPTARG;;
s) part+=("$OPTARG");;
 esac
done
shift $((OPTIND -1))

getArray(){ for val in "${part[@]}"; do
  echo "$val"

getPart(){ getArray | while read -r param1; do 
 echo "$param1" | sed 's/=.*//'}

parts=$(getPart)

我有一个info.csv配置文件:

name,part,area,partcode
fiat,exhaust,store,123
fiat,engine,store,132
ford,exhaust,store,145
ford,windscreen,store,134

运行命令后,我将使用grep "$name,$part,$area" info.csv | cut -d, f4根据运行脚本时用户输入的标志值提取特定字段。

每次运行脚本时,我将-s标志使用一次,两次或三次,并使用不同的值。

值的格式错误(即-s fiat=1 -s exhaust=2,并且我在上面的grep语句中使用它们访问的列要求它们的格式为fiatexhaust),因此我使用sed删除=1=2

我想将这些现在正确格式化的值作为$part变量重用。但是我在将新格式化的值重新分配回$part变量时遇到了麻烦。

我的问题是:

  1. 在对命令执行命令以使其格式正确后,如何在bash中重新分配变量?
分析解答

如果我理解正确,您可以为数组${part[@]}分配一个值,然后再为该数组中的每个元素从=登录上删除字符串的结尾。

与其第二遍遍遍数组,不如从头开始按照以下方式正确地初始化数组的每个元素:

...
s) part+=("${OPTARG%%=*}");;
...

有关删除匹配的postfix模式的更多说明,请参见bash手册。