bash - "${foo//@(...)/}" 仅在命令行中有效,在脚本中无效
问题描述
我有以下命令"${CHROMEDRIVER//@([\/])/}"
是 shell 文件并且在运行bash file.sh
时,它不起作用:
#!/bin/bash
CHROMEDRIVER="75.0.3770.8/"
echo $CHROMEDRIVER
echo "${CHROMEDRIVER//@([\/])/}"
但是,当我在终端中运行相同的 cmd"${CHROMEDRIVER//@([\/])/}"
时,效果很好
解决方案
此命令需要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 中所述。
推荐阅读
- r - 根据列名和行名替换矩阵元素
- javascript - 将父 URL 传递给 iframe 中的表单字段
- java - 动态报告 XLS、CSV
- javascript - Javascript 根据特定的类属性创建对象
- python - 分类中的目标变量是否需要数字编码?
- python - 如果 txt 文件中存在空格,则转到 python 中的下一行,我该如何在 python 中执行此操作
- xml - XSD 2 个元素一次,1 个元素 1+ 任意顺序
- css - 未能在 div 的中心显示微调器
- r - 如何用 R 制作条形图
- javascript - 取消选中复选框时如何清除 jquery.businesshours 中文本字段的值?