我正在尝试编写一个小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//'
它尝试更改为与链接名称相同的目录。 我该如何解决这个问题?
答案 0 :(得分:1)
您的cd
命令失败,因为正如您编写的那样,sed
处理的输入是cd
命令本身的输出,而不是$1
命令的输出。 {1}}变量。
但是你不需要sed
来删除字符串的一部分,你可以单独使用参数扩展来做到这一点:
$ link='https://aur.archlinux.org/example.git'
$ echo "$(link="${link##*/}"; printf '%s' "${link%.git}")"
example
但是,如果您尝试cd
到example
目录,则以下内容可能会在您的脚本中使用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