“ ${foo//@(...)/}”仅在命令行中有效,而在脚本中无效

时间:2019-07-07 13:45:10

标签: bash shell

我有以下命令"${CHROMEDRIVER//@([\/])/}"是外壳文件,并且在运行bash file.sh时不起作用:

#!/bin/bash

CHROMEDRIVER="75.0.3770.8/"
echo $CHROMEDRIVER
echo "${CHROMEDRIVER//@([\/])/}"

Screenshot showing unwanted slashes in output

但是,当我在终端中运行相同的cmd "${CHROMEDRIVER//@([\/])/}"时,效果很好

Screenshot showing slashes removed on interactive invocation

1 个答案:

答案 0 :(得分:3)

此命令需要启用extglob支持。大概是在点文件中将其打开(使用shopt -s extglob),但是在脚本中默认为关闭。

请参见the bash-hackers' wiki on extended pattern language,其中描述了需要启用extglob标志的特定项目; @(...)在其中。

因此,要在不更改要替换的模式的情况下修复脚本,

#!/usr/bin/env bash

shopt -s extglob

CHROMEDRIVER="75.0.3770.8/"
echo "$CHROMEDRIVER"
echo "${CHROMEDRIVER//@([\/])/}"

...尽管您的目标只是去除斜杠,但应使用"${CHROMEDRIVER%/}",如the bash-hackers' wiki page on parameter expansion中所述。