bash - 有条件地在变量前面加上斜杠
问题描述
我以为我能解决这个问题。我以前写过更复杂的 shell 脚本,所以我认为这很容易做到。我现在浪费了一个小时,把头发扯掉了,因为我所做的一切都不起作用,而且我在网上找不到任何有用的帮助。
我想做的只是相当于这里的这个简单的小 C# 代码片段:
var splat = "some/path";
if (!splat.StartsWith("/"))
{
splat = $"/{splat}";
}
取一个字符串参数。如果它以斜线开头,则什么也不做。如果它不以斜杠开头,请将其添加到字符串变量的前面。
如何在 bash 脚本中完成这个明显的艰巨任务?
我的尝试:
#!/bin/bash
dir="/root/home"
sub_dir=$1
echo "argument given: '"$sub_dir"'"
if [ ! -z $sub_dir ]
then
echo "before: "$dir$1
if [[ "${sub_dir}" != *'/' ]]; then
echo "starts with slash!"
else
echo "doesn't start with slash!"
$sub_dir="\/"${sub_dir}
echo "slash added: "$sub_dir
fi
else
echo "argument not given"
echo $dir
fi
echo "$dir$sub_dir"
我也尝试过使用正则表达式,但条件没有成功:
if [[ "$HOST" =~ ^user.* ]]; then
我还没有找到一种方法来传递一个以斜杠开头的参数,或者创建一个以斜杠开头的字符串,但出于某种原因,将其视为文件路径而不是字符串(并随后导致错误)。
编辑:bash --version
说它是 GNU bash verison 5.0.17,如果这有什么不同的话。
解决方案
使用参数扩展,如果它是斜杠则删除前导字符,否则保持值不变,并在结果前面加上斜杠。
$ s1=some/path s2=/some/path
$ echo /${s1#/}
/some/path
$ echo /${s2#/}
/some/path
简而言之,您可以将 if 命令替换为以下行:
sub_dir=/${sub_dir#/}
推荐阅读
- python - 使用递归,我得到的答案比正确答案少一个
- arrays - 从 JSON 数组的所有块中提取键/值对,然后使用 BASH 和 JQ 将其作为新的键/值对附加到 JSON 数组的每个块中
- c# - 控制器可以支持带有可变字符串参数的路由吗?
- arrays - C - 将 64 个字符的数组转换为 16 个无符号整数的数组
- c# - EF Core 查询优化:我可以在 List 上使用 Contains
? - javascript - 如何在反应中使用“切片”功能?
- javascript - React 开发工具显示数据状态,控制台显示为空
- python - django postagedb 命令 refresh_from_db 导致 MemoryError 或 .DatabaseError: out of memory for query result
- html - 内容不够溢出时如何粘底?
- excel - 在 Excel 中查找今天和特定日期之间的月数