Bash 参数扩展

2023-12-15

我有一个使用以下逻辑的脚本:

if [ ! -z "$1" ]; then         # if any parameter is supplied
    ACTION=                    # clear $ACTION
else
    ACTION=echo                # otherwise, set it to 'echo'
fi

这工作正常,按原样。然而,在阅读外壳参数扩展的部分bash手册,看来这应该能够一步完成。但是,我不太清楚如何做到这一点。

我试过了:

ACTION=${1:-echo}              # ends up with $1 in $ACTION

ACTION=${1:+}
ACTION=${ACTION:-echo}         # ends up always 'echo'

以及一些嵌套它们的方法,但据我所知,嵌套似乎是不允许的。

我意识到我已经有了一个可行的解决方案,但现在我真的很好奇这是否可能。对于三元运算符来说这是很简单的事情,但我认为 bash 没有。

如果可能的话,我希望看到执行这个看似两步过程的逻辑,没有 if/else 结构,但是仅使用以下任意组合外壳参数扩展特征.

谢谢。


EDIT对于接骨木:

脚本的其余部分只是:

find . -name "*\?[NMSD]=[AD]" -exec ${ACTION} rm -f "{}" +

我只是想ACTION=echo作为对我自己的健全性检查,因此,传递任何参数实际上都会执行删除(通过使 ${ACTION} 无效,而不传递任何参数会在其中留下回显。

我认识 TIMTOWTDI;我想看看是否可以仅使用 Shell 参数扩展部分中的内容来完成:-)


EDIT对于米克尔来说:

$ cat honk.sh
#!/bin/bash
ACTION=${1-echo}
echo $ACTION
$ ./honk.sh
echo
$ ./honk.sh foo
foo

最后需要有ACTION='',从而返回空行/空值。


如果我坚持用少于 4 行并且没有子 shell 来完成它,那么我想我会使用:

ACTION=${1:+' '}
: ${ACTION:=echo}

这有点作弊 - 如果脚本有参数,它会创建一个空白动作而不是空动作。如果没有参数,则 ACTION 在第二行之前为空。在第二行,如果 action 为空,则将其设置为“echo”。在扩展中,由于您(正确地)没有引用 $ACTION,因此不会为空白传递任何参数。

测试员(xx.sh):

ACTION=${1:+' '}
: ${ACTION:=echo}

echo $ACTION rm -f a b c

Tests:

$ sh xx.sh 1
rm -f a b c
$ sh xx.sh
echo rm -f a b c
$ sh xx.sh ''
echo rm -f a b c
$ 

如果最后一行不正确,则删除加号之前的冒号。


如果子 shell 是可接受的,则以下两行之一可以工作:

ACTION=$([ -z "$1"     ] && echo echo)
ACTION=$([ -z "${1+X}" ] && echo echo)

第一个对应于上面显示的第一个版本(空的第一个参数被视为不存在);第二个处理当前的空参数。你可以写:

ACTION=$([ -z "${1:+X}" ] && echo echo)

使与第二个的关系更清晰 - 除非你只使用其中之一,而不是两者。


由于我的评论中的降价符号混淆了系统(或者我弄错了但没有足够快地修复它),我的最后一条评论(稍作修改)应该是:

符号${var:+' '}意思是“如果$var已设置且不为空,然后使用以下内容+'(在本例中,是一个空格)。符号${var+' '}意思是“如果$var已设置 - 无论它是否为空 - 然后使用后面的内容+'。这些其他扩展是类似的:

  • ${var:=X} - set $var to X除非它已经具有非空值。
  • ${var:-X}- 扩展到$var如果它具有非空值并扩展到X if $var未设置或为空

删除冒号会删除测试的“空”部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash 参数扩展 的相关文章

随机推荐

  • 如何从一个类中调用另一个类中的函数?

    更新 修改标题以更好地反映我的问题 大家好 我今天的问题围绕着我试图从一个子类发送到另一个子类的 CustomEvent 我已经使用我的 CustomEvent 类将事件从子类传递到我的主类 但我不确定由谁在子类之间执行此操作 我的自定义事
  • 将日期转换为时间戳 UTC

    我是 Java 新手 想知道如何将日期转换为时间戳 如果我向它传递一个日期 反之亦然 我在 StackOverflow 上搜索过 但没有一个问题能解决我的问题 我需要在 JSON 中使用此时间戳作为 highcharts API 上的参数来
  • sql中如何求中位数

    我有以下 sql 查询 它给出了按月 周和日分组的总 h time 相反 我想要月 周和日的 h time 中位数 如何在 Oracle SQL 中执行此操作 SELECT DAY MEDIAN H TIME AS HANDLE TIME
  • 创建一个函子作为可调用类或嵌套函数[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在 Python 3 中你可以创建这样的类 class foo def init self x self x x def call self y self x self x 1 retur
  • 如何确保MySQL数据库在增加字段时不存在竞争条件?

    当两个连接想要更新同一条记录时 如何防止 MySQL 数据库中的竞争条件 例如 连接 1 想要增加 尝试 计数器 第二个连接也想做同样的事情 两个连接SELECT 尝试 计数 增加值 两者UPDATE 尝试 增加的值 突然间 tries 只
  • 为什么 XPath 选择上下文节点之外的节点?

    我将 XPath 与 Node js 结合使用 并且有以下 HTML 文档 我想在其中选择所有文章节点 然后在第二步中选择所有带有类的 div abc
  • Javascript/XML - 获取节点名称

    我需要获取标签 myChild 的名称和 内容 这很简单 但我被困住了 困了 这是我通过测试得到的结果 XML
  • 如何强制章节在 ODD 页面(html 和 epub)上开始

    Chapter padding bottom 30vh break before right important 好消息 章节从自己的页面开始 坏消息 预期的行为 在主框之前强制一两个分页符 哪个将使下一页成为正确的页面 被浏览器和任何 e
  • 在 Android 中跨活动播放 BG 音乐

    你好 第一次在 stackoverflow 上提问 令人兴奋 哈哈 我们正在开发一个 Android 游戏 我们为我们的介绍播放一些背景音乐 我们有一个介绍活动 但我们希望它继续播放到下一个活动 并且也许能够从游戏内的任何地方停止或再次播放
  • pip install mysql-python 失败并出现环境错误:找不到 mysql_config

    这是我得到的错误 mysite zjm1126 zjm1126 G41MT S2 zjm test mysite pip install mysql python Downloading unpacking mysql python Dow
  • 在 JAVA 中获取给定日期范围(DateX 和 DateY)之间的所有星期一和星期四日期将是一个很好的实现

    我想在给定的日期范围内获取一些天数 对此的最佳解决方案是什么 例如 我想获取从今天到两个月的所有星期一 星期三和星期四的日期 使用java time 现代方法使用 java time 类 实例化List对象来收集您的结果 List
  • 不同分辨率下的 Windows 窗体大小问题

    我是窗口表单开发的新手 在开发了一些表单后 我注意到表单在不同的分辨率下无法正确显示 表单在某些分辨率下超出了屏幕 我想知道是否有任何设置可以根据分辨率自动调整表单 或者是否有任何黑客或一些技术可以用来设计表单 请详细说明您的答案 因为我对
  • 如何使用 pyautogui 检测图像并单击它?

    我想学习如何让机器人点击图像 我尝试观看 yt 教程 但我找不到代码中的错误 因为这实际上是我第一次使用 python 我尝试了以下代码 from pyautogui import import pyautogui import time
  • 使用二分查找在排序的多维数组中查找数字

    我们得到了一个递增排序的多维数组 例如 int mat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 如何使用二分查找来查找特定数字 假设我正在寻找 3 您可以通过将一维索引转换为其对应的二维索引来实现此目的
  • 在数据库中记录 Hangfire RecurringJob 的执行情况?

    我已经设置了hangfire我的 ASP NET 项目成功 即在我的数据库中创建了 11 个 Hangfire 表 我在里面尝试了以下命令Application Start 我的项目的Global asax namespace myAPI
  • SQLite DATETIME 列与实体框架

    我有一个现有的 SQLite 数据库 我想在实体框架中使用它 然而 SQLite 奇怪的类型系统意味着你甚至可以 create table temp temp datetime insert into temp values whateve
  • 使用 PHP 身份验证进行 HTTP 身份验证

    我正在为我的网站创建一个会员区域 并且它已经在运行 我使用 mysql 和 php 对成员进行身份验证 效果非常好 但现在出现问题 我想为会员提供将文件上传到系统的可能性 并且这些文件应该仅对登录的会员可用 我知道我可以将这些文件存储到数据
  • SyntaxError: 当尝试将对象参数传递给 onclick 函数时,元素列表后缺少 ]

    我正在尝试迭代对象列表 并使用按钮为每个对象创建一个列表项 当我添加onclick对他们起作用 我收到这个错误 语法错误 元素列表后缺少 这是我的代码 box resources forEach function box box resou
  • 遗传算法中的轮盘选择

    谁能提供一些轮盘赌选择函数的伪代码 我将如何实现这个 我真的不明白如何阅读这个数学符号 我从来没有做过任何概率或统计数据 我自己这样做已经有几年了 但是在谷歌上很容易找到以下伪代码 for all members of population
  • Bash 参数扩展

    我有一个使用以下逻辑的脚本 if z 1 then if any parameter is supplied ACTION clear ACTION else ACTION echo otherwise set it to echo fi