【问题标题】:Bash string manipulation works differently in shell than .sh file?bash 字符串操作在 shell 中的工作方式与 .sh 文件不同?
【发布时间】:2014-02-09 04:07:54
【问题描述】:

我有一个脚本可以在我的 .deb 系统上获取和设置最新的 NodeJS:

echo "Downloading, building and installing latest NodeJS"
sudo apt-get install python g++ make checkinstall
mkdir /tmp/node_build && cd $_
curl -O "http://nodejs.org/dist/node-latest.tar.gz"
tar xf node-latest.tar.gz && cd node-v*
NODE_VERSION="${PWD#*v}"
#NODE_VERSION=python -c "print '$PWD'.split('-')[-1][1:]"
echo "Installing NodeJS" $NODE_VERSION

./configure
sudo checkinstall -y --install=no --pkgversion NODE_VERSION
sudo dpkg -i node_$NODE_VERSION

不幸的是,它不起作用;作为echo 行输出:

安装 NodeJS i8/dir-where-runnning-script-from/node-v0.10.24

它确实可以在 shell 中工作:

$ cd /tmp/node_build/node-v0.10.24 && echo "${PWD#*v}"
0.10.24

【问题讨论】:

  • 什么不起作用?如果你这样做 echo "${NODE_VERSION#*v}" 你应该得到相同的结果。尽管您确实应该使用"${NODE_VERSION##*v}",但"${NODE_VERSION#*v}" 仅适用于您的路径不包含v
  • 我的路径有一个v;见/tmp/node_build/node-v0.10.24。我需要从那个字符串中取出版本号,我用"${PWD#*v}" 做。如果您查看我的问题,我会展示我得到的输出和预期的输出。
  • 对不起,我的意思是在那之前有一个v。如果你在cd_ 之后的脚本中echo $PWD,你会得到什么

标签: node.js bash shell installation environment-variables


【解决方案1】:

路径中是否还有另一个“v”,例如“i8/”之前? #*v 将通过变量中的first "v" 移除;我很确定你想要##*v,它将通过变量中的 last "v" 删除。 (技术上,# 删除最短匹配前缀,## 删除最长匹配)。因此:

NODE_VERSION="${PWD##*v}"

应该可以。

【讨论】:

  • 谢谢,成功了。如果允许我会接受这个作为答案。
【解决方案2】:

试试这个

sudo checkinstall -y --install=no --pkgversion "${NODE_VERSION##*v}"

【讨论】:

    猜你喜欢
    • 2014-05-20
    • 2019-11-30
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2016-01-14
    • 2012-09-02
    • 1970-01-01
    相关资源
    最近更新 更多