通常我可以自己(和谷歌)解决问题。但最近我对这种奇怪的现象感到困惑。
背景:我使用一系列脚本进行文件处理(在 Windows 中,在 Cygwin 下。脚本也在 OS X 上使用 gnu baseutil 运行)。安装一天后实时工具,我的脚本停止工作。经过一番麻烦之后,我终于发现了一个问题。
问题:我有以下行:
key=$( echo "$foo" | tr -d - | tr '[:upper:]' '[:lower:]' )
其中$foo
只是另一个文本变量。我删除了破折号$foo
并将其转换为小写。该脚本运行了数千次。
但现在不行了。如果我跑
echo "Blah-Bleh" | tr -d - | tr '[:upper:]' '[:lower:]'
我明白blahbleh
这是预期的。但如果我这样做
a=$(echo "Blah-Bleh" | tr -d - | tr '[:upper:]' '[:lower:]')
echo $a
我什么也没得到。$a
为空并且 [[ -z $a ]] 返回true
。但是,如果我恢复到老式反引号,该命令将再次起作用:
a=`echo "Blah-Bleh" | tr -d - | tr '[:upper:]' '[:lower:]'`
echo $a
给出blahbleh
.
现在我能将所有命令替换替换为旧样式,但这更多的是一种解决方法而不是解决方案。那么我的 StackExchangers 同胞们,我错过了什么以及如何解决它?真的很烦人。
附注到目前为止我自己的诊断:
- 卸载 Rtools 没有帮助;
- 重新启动机器没有帮助;
- 重新安装每一个Cygwin 包没有帮助;
bash
版本是4.3.42(4);~/.bashrc
现在我在、~/.bash_profile
、~/.profile
、/etc/profile
中一无所有/etc/bash.bashrc
。在Rtools之前不确定;- 我看不出有什么问题
$PATH
。
答案1
好吧,经过大量的摆弄和拉扯之后,我已经成功地将 Cygwin 恢复到工作状态。这就是我所做的:
- 删除了 Rtools
- 清除任何 Cygwin/Rtools 相关条目的 Windows %PATH%;
- 重新安装了所有 Cygwin 软件包(来自缓存);
- 重新设计的 Cygwin;
- 并且重新启动计算机的次数超过了需要的次数。
回去工作...
附言。尽管 Cygwin 再次工作,但我发现为 bash 数组赋值的原始行不再产生正确的结果。必须改变这个
read -r -a array <<<$(printf $string)
对此
array=($(printf $string))
使其发挥作用。一定是 bash 更新,一定是。
答案2
我不太清楚为什么你的管道没有按预期工作,但我确实知道它可以做得更好:
a='Blah-Bleh'
a=${a//-/}; a=${a,,}
printf '%s\n' "$a"
这使用内置替换,bash
并且比命令替换更快。第一个,a=${a//-/}
,将删除 中的所有破折号$a
,而第二个,a=${a,,}
将小写整个字符串。
bash
这应该在4.0 及更高版本中有效。