标签: parameter-expansion

Shell参数扩展:$#vs. $ {#@}

在一个shell脚本,据我所知,$#${#@}相同的行为,既给位置参数的个数.这两者之间是否存在差异?在哪种情况下,哪一种优于另一种?

bash shell parameter-expansion

1
推荐指数
1
解决办法
174
查看次数

snakemake配置参数值是否可以插入/扩展{<name>}值的字符串?

有没有办法在.yaml文件中定义snakemake配置字符串,以便它可以包含{wildcard}和{param}值,并且当在shell命令中使用该字符串时,{<name>}值将替换为"<name>"的实际值?

例如,假设您希望配置字符串定义要作为参数传递给程序的字符串格式:

RG:"ID:{ID} REP:{REP}"

其中上面是.yaml文件,ID和REP是通配符,shell命令会将展开的字符串作为参数传递给程序.

wildcard-expansion parameter-expansion snakemake

1
推荐指数
1
解决办法
1323
查看次数

如何在 Perl 中使用 Shell 参数扩展?

我正在尝试实现 Bash 参数扩展技术来替换 Perl 脚本中文件的现有扩展名。

这是我的 bash 代码,用于替换工作正常的文件扩展名:

mv "$f" "${f%.*}.png"
Run Code Online (Sandbox Code Playgroud)

另一方面,我试图在 Perl 脚本中使用它system()

system('mv', "$a/$fileName", "$a/${fileName%.*}".'.png');
Run Code Online (Sandbox Code Playgroud)

$a 保存通过命令行参数传递的目录名称。

它抛出"syntax error near %"后跟"missing right curly or square bracket within string". 错误消息中没有 EOF。

当我不使用时,%.*它只是.png在现有文件结尾后追加,但不会替换。一些帮助将不胜感激。

bash perl parameter-expansion

1
推荐指数
1
解决办法
142
查看次数

为什么这个 Bash 字符串替换不起作用?

我试图在 bash 中进行字符串替换,以转义版本号中的点,最终传递给 grep。当我跑步时

echo ${3.9.1//./\\.}

预期输出是3\.9\.1. 我得到一个bad substitution错误。我不明白这怎么不正确。

bash parameter-expansion

1
推荐指数
1
解决办法
384
查看次数

删除前导空格在 Bash 中不起作用

我在 Bash 中有一个字符串,它可能以也可能不以任意数量的前导空格开头,例如

"  foo bar baz"
" foo bar baz"
"foo bar baz"
Run Code Online (Sandbox Code Playgroud)

我想从字符串中删除“foo”的第一个实例,以及任何前导空格(可能没有)。

按照这个问题的建议,我尝试了以下方法:

str=" foo bar baz"
regex="[[:space:]]*foo"
echo "${str#$regex}"
echo "${str#[[:space:]]*foo}"
Run Code Online (Sandbox Code Playgroud)

如果 str 有一个或多个前导空格,那么它将返回我想要的结果,即_bar baz(下划线 = 前导空格)。如果字符串没有前导空格,则不会执行任何操作并返回foo bar baz. 两个“回声”在这里返回相同的结果。

我的理解是使用*after[[:space:]]应该匹配零个或多个 [[:space:]] 实例,而不是一个或多个。我在这里错过了什么或做错了什么?

编辑

@Raman - 我尝试了以下方法,但它们也不起作用:

echo "${str#[[:space:]]?foo}"
echo "${str#?([[:space:]])foo}"
echo "${str#*([[:space:]])foo}"
Run Code Online (Sandbox Code Playgroud)

无论是否有尾随空格,所有三种解决方案都不会删除 'foo'。唯一可行的解​​决方案是我用星号发布的解决方案 - 当有尾随空格时它会删除 'foo',但没有时则不会。

string bash removing-whitespace parameter-expansion

0
推荐指数
1
解决办法
74
查看次数

如何在bash中正确使用参数扩展

我有一个带有结构的字符串task_name-student_name,我想将它分成两个变量:

  • task:包含之前的块-
  • student:包含后面的块-

我可以让它工作sed

string="task_name-student_name"
student=$(echo "$string" | sed "s/.*-//")
task=$(echo "$string" | sed "s/-[^-]*$//")
Run Code Online (Sandbox Code Playgroud)

然而,VS Code 建议“看看是否可以使用 $(variable//search/replace) 代替”。

所以我有两个问题:

  1. 为什么会$(variable//search/replace)更好
  2. 如何使参数扩展正常工作而不将其解释为命令?

当我尝试时

echo $("$string"//-[^-]*$//)
Run Code Online (Sandbox Code Playgroud)

或者

echo $(echo $("$string"//-[^-]*$//))
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

bash: task_name-student_name//-[^-]*$//: No such file or directory
Run Code Online (Sandbox Code Playgroud)

提前致谢!

bash parameter-expansion

0
推荐指数
1
解决办法
1814
查看次数

bash 使用参数扩展表达式在两个字符串之间读取

这就是我的输入字符串的样子:

INPUT_STRING="{/p1/p2=grabthistext}"
Run Code Online (Sandbox Code Playgroud)

我想grabthistext从 打印INPUT_STRING

我尝试了echo "${INPUT_STRING##*=}"哪些打印grabthistext}

grabthistext如何使用参数扩展表达式只读?

bash parameter-expansion

0
推荐指数
1
解决办法
71
查看次数