我尝试在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脚本时,我使用基本的测试语句实现默认值
if [ -z $foo ]
then
foo=$bar
fi
Run Code Online (Sandbox Code Playgroud)
今天我遇到了更高级的参数扩展,似乎做了同样的事情
${foo:=$bar}
Run Code Online (Sandbox Code Playgroud)
这两种方法比较如何?它们的优点/缺点是什么?
编辑:修复了评论中指出的一些拼写错误
我想使用参数扩展获取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)
但我对参数扩展很新,所以我认为这可以进行优化.有没有办法只用一行呢?
在下面的代码块中,如何评估第 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) 我在查看其他人的shell脚本时遇到了问题。
我看到宣布
APP_NAME="${0##*[\\/]}"
Run Code Online (Sandbox Code Playgroud)
由于我找不到任何答案,因此这段代码的含义是什么?
我正在尝试实施一个解决方案来增加版本。这是我想出的:
#!/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 的建议答案更新了代码
我想从电子邮件中提取用户名。示例: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)
问题是,我应该在位置和长度上写什么。代码如何知道我是否需要提取“@”之前的所有字母。任何的想法?谢谢!
如何更改 Bash 中的命令行参数?解释如何修改 bash 中的输入参数。
但就我而言,我有一组动态的输入参数。我不知道有多少人。
这是我的命令:
send url key1=value1 key2=value2 key3=value3
Run Code Online (Sandbox Code Playgroud)
我想将所有=标志更改为:自动。并且key=value配对不限。
我怎样才能做到这一点?
我需要在 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?
我正在尝试在 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它本身,但我想使用参数扩展。