bash 截断字符串适用于命令行但不适用于脚本

bash truncate string Works on commandline but not in script

我正在尝试从字符串末尾截断所有出现的字符。

我想出的测试脚本是:

#!/bin/bash
Input="/tmp/blah/bloh/////////////"

Desired="/tmp/blah/bloh"

cut='/'

result=${Input%%+(${cut})}

echo "          Input: ${Input}"
echo "Expected result: ${Desired}"
echo "         Result: ${result}"
echo "---------------------------------------"
echo -n "        Outcome: "

[ "${Desired}" = "${result}" ] && echo "Success!" || echo "Fail!"

运行 此脚本通过 bash /tmp/test.sh 给出以下输出:

          Input: /tmp/blah/bloh/////////////
Expected result: /tmp/blah/bloh
         Result: /tmp/blah/bloh/////////////
---------------------------------------
        Outcome: Fail!

但是,如果我将整个内容复制并粘贴到我的控制台中,我会得到 /tmp/blah/blah

的预期结果

这是怎么回事?

+(${cut})是扩展模式,bash默认不识别。您需要先启用 extglob 选项。

$ shopt -s extglob
$ Input="/tmp/blah/bloh/////////////"
$ cut='/'
$ echo "${Input%%+(${cut})}"
/tmp/blah/bloh

您可能通过 .bashrc.bash_profile 配置文件在交互式 shell 中启用了 extglob,但这两个文件都没有用于非交互式 shell 由您的脚本启动。