首页 > 解决方案 > "${foo//@(...)/}" 仅在命令行中有效,在脚本中无效

问题描述

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

#!/bin/bash

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

显示输出中不需要的斜线的屏幕截图

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

显示在交互式调用中删除斜线的屏幕截图

标签: bashshell

解决方案


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

请参阅bash-hackers 的关于扩展模式语言的 wiki,描述需要extglob启用标志的特定项目;@(...)是其中之一。

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

#!/usr/bin/env bash

shopt -s extglob

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

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


推荐阅读