如何剪切字符串并将其发送到'cd'命令

时间:2018-06-11 18:28:23

标签: shell unix

我正在尝试编写一个小shell脚本,以帮助在ArchLinux上更新AUR中的包。练习编写shell脚本比编写其他任何东西更多。我发送git存储库链接作为参数,稍后需要获取依赖于git链接的文件夹名称。

echo "$1" | sed 's/.*\///' | sed 's/\.git//'

如果我的git链接是https://aur.archlinux.org/example.git,它会将example写入终端。这是预料之中的。 但是如果我做的话

cd "$1" | sed 's/.*\///' | sed 's/\.git//'

它尝试更改为与链接名称相同的目录。 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

您的cd命令失败,因为正如您编写的那样,sed处理的输入是cd命令本身的输出,而不是$1命令的输出。 {1}}变量。

但是你不需要sed来删除字符串的一部分,你可以单独使用参数扩展来做到这一点:

$ link='https://aur.archlinux.org/example.git'
$ echo "$(link="${link##*/}"; printf '%s' "${link%.git}")"
example

但是,如果您尝试cdexample目录,则以下内容可能会在您的脚本中使用BASH_REMATCH数组:

#!/usr/bin/env bash

link="$1"

if [[ $link =~ ^https?://.*/([^.]+).git$ ]]; then
  cd "${BASH_REMATCH[1]}"
else
  printf 'Invalid link: %s\n' "$link"
fi