标签: parameter-expansion

在dot之前提取子字符串

我尝试在bash中的dot(.)之前减去第一个字符串.

例如:

1.2.3 -> 1
11.4.1 -> 11
Run Code Online (Sandbox Code Playgroud)

我根据文档使用了以下命令:

s=4.5.0
echo "${s%.*}"
Run Code Online (Sandbox Code Playgroud)

但它4.5取而代之的是ouptuts 4.我不明白.

这是为什么?

bash parameter-expansion

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

使用参数expand vs if/else test -z设置默认变量

因此,传统上,当我使用参数标志编写bash脚本时,我使用基本的测试语句实现默认值

if [ -z $foo ]
then
    foo=$bar
fi
Run Code Online (Sandbox Code Playgroud)

今天我遇到了更高级的参数扩展,似乎做了同样的事情

${foo:=$bar}
Run Code Online (Sandbox Code Playgroud)

这两种方法比较如何?它们的优点/缺点是什么?

编辑:修复了评论中指出的一些拼写错误

parameters bash optional-parameters parameter-expansion

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

Bash参数扩展 - 获取文件的直接父目录

我想使用参数扩展获取foo给定文件的直接父目录的名称,例如给定/home/blah/foo/bar.txt.现在我可以用两行来做:

f="/home/blah/foo/bar.txt"
dir_name="${f%/*}"
immediate_parent="${dir_name##*/}"
Run Code Online (Sandbox Code Playgroud)

但我对参数扩展很新,所以我认为这可以进行优化.有没有办法只用一行呢?

bash shell parameter-expansion

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

用双插入符号进行参数扩展 ^^

在下面的代码块中,如何评估第 3 行和第 4 行?

for f in "${CT_LIB_DIR}/scripts/build/debug/"*.sh; do
    _f="$(basename "${f}" .sh)"
    _f="${_f#???-}"
    __f="CT_DEBUG_${_f^^}"
done
Run Code Online (Sandbox Code Playgroud)

regex bash parameter-expansion

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

Shell中的“ $ {0 ## * [\\ /]}”是什么意思?

我在查看其他人的shell脚本时遇到了问题。

我看到宣布

APP_NAME="${0##*[\\/]}"
Run Code Online (Sandbox Code Playgroud)

由于我找不到任何答案,因此这段代码的含义是什么?

bash parameter-expansion

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

shell 脚本中的 semver 增量

我正在尝试实施一个解决方案来增加版本。这是我想出的:

#!/bin/sh -x

VAR=1.0.1 # retrieved from Gitlab API

case $1 in
patch)
    TAG=${VAR%.*}.$((${VAR##*.} + 1))
    ;;

major)
    TAG=$((${VAR%%.*} + 1)).0.0
    ;;

*)
    tmp=${VAR%.*}
    minor=${tmp#*.}
    TAG=${VAR%%.*}.$((minor + 1)).0
    ;;
esac

echo $TAG

Run Code Online (Sandbox Code Playgroud)

major&patch按预期工作;但是,我面临着增加的问题minor

碰撞时1.0.1,未成年人应1.1.0;但是,我的代码生成1.2.0. 我究竟做错了什么?

更多信息,该脚本在 GitlabCI 管道内执行。

编辑:使用 @jhnc 的建议答案更新了代码

sh parameter-expansion

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

使用 linux 子字符串 bash 从电子邮件中删除域

我想从电子邮件中提取用户名。示例:johndoe@gmail.com 域将始终为@gmail.com,但用户名的长度可以不同但我必须在 linux bash 中使用子字符串(无 grep、sed、cut 等),例如:

str="johndoe@gmail.com"
echo ${str:position:length}
Run Code Online (Sandbox Code Playgroud)

或者可能使用如下循环:

length=`expr length "$str"`
for ((i=0; i<$length; i++))
do
    echo ${str:$i:length}
done
Run Code Online (Sandbox Code Playgroud)

问题是,我应该在位置和长度上写什么。代码如何知道我是否需要提取“@”之前的所有字母。任何的想法?谢谢!

string bash email-address parameter-expansion

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

如何替换任意数量的命令行参数中的每个分隔符,这些参数都是分隔的名称-值对?

如何更改 Bash 中的命令行参数?解释如何修改 bash 中的输入参数。

但就我而言,我有一组动态的输入参数。我不知道有多少人。

这是我的命令:

send url key1=value1 key2=value2 key3=value3
Run Code Online (Sandbox Code Playgroud)

我想将所有=标志更改为:自动。并且key=value配对不限。

我怎样才能做到这一点?

bash positional-parameter parameter-expansion

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

/bin/dash:错误替换

我需要在 shell 脚本 ( ) 中进行字符串操作/bin/dash

#!/bin/sh

PORT="-p7777"
echo $PORT
echo ${PORT/p/P}
Run Code Online (Sandbox Code Playgroud)

最后一个回显失败并显示Bad substitution。当我将 shell 更改为 bash 时,它可以工作:

#!/bin/bash

PORT="-p7777"
echo $PORT
echo ${PORT/p/P}
Run Code Online (Sandbox Code Playgroud)

如何实现 中的字符串替换dash

string bash sh parameter-expansion dash-shell

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

Zsh 与 Bash 中的参数扩展:“${VAR,,}”的等价物是什么?

我正在尝试在 macOS (11.4) 上使用 bash/zsh 参数扩展执行大小写修改并犯了一些错误。具体来说,我想获取一个包含字符串的变量并将其转换为蛇形(即: from This is a STRINGto this_is_a_string)。我正在采取小步骤,到目前为止我只是想把所有东西都变成小写,据我所知,这个理论应该是这样的:

$ VAR="StRING"
$ echo "${VAR,,}" # turn the string characters to lowercase
string
Run Code Online (Sandbox Code Playgroud)

这起初不起作用,因为 macOS bash 是非常过时的 3.2.57。我用自制软件安装了当前版本(5.1.8)并且它工作正常。

尽管如此,这不适用于 zsh(最新版本)。我猜这是因为 zsh 中的参数扩展不同,对吗?尽管如此,我还是找不到任何足智多谋的参考资料。我相信 zsh 的工作方式有点不同,更像是sed. 当然,我可以使用tr甚至sed它本身,但我想使用参数扩展。

zsh parameter-expansion

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