问题标签 [parameter-expansion]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
string - /bin/dash:替换错误
我需要在 shell 脚本(/bin/dash
)中进行字符串操作:
最后一个回声失败了Bad substitution
。当我将 shell 更改为 bash 时,它可以工作:
如何实现字符串替换dash
?
bash - BASH参数扩展时单引号行为不一致的原因?
使用 BASH Parameter Expansion时,可以引用/转义变量扩展为的字符串,这可以正常工作,除非使用单引号并且整个变量用双引号转义:
有趣的是,$' '
报价正常工作,而' '
没有。如果变量本身没有被引用,单引号开始正常工作:
$var
但是,如果它本身包含空白字符,则可能会导致其他问题。
这种不一致有什么好的理由吗?
zsh - zsh参数扩展中的双引号
我有两个测试用例zsh
A. 不带引号
/li>B. 带引号
/li>
但是,如果我首先将输出分配给echo
变量,则引号不会产生任何影响:
C. 不带引号
/li>D. 带引号
/li>
问题:
- 比较A和B,是什么导致了差异?
- 比较A和C,是什么导致了差异?
string - 为什么子字符串提取提取整个单词而不是字符?
给定一个文件test.txt
,This is a test.
我想提取其内容的子字符串,更具体地说是第二个和第三个字符(hi
),使用命令
但是,这会输出第二个和第三个单词 ( is a
) 而不是单个字符。
我可以
它按预期工作。但我想在一个命令中完成。
有人可以解释这里发生了什么并提供解决方案吗?
编辑:
系统正在运行 zsh。
bash - 这个 shell 语法的机制:${1:-$(
我最近在创建函数的上下文中遇到了这种非常简洁的语法,该bash
函数可以接受来自 STDIN 的参数或流(即可以通过管道传输到)。从表面上看,我了解这里发生了什么,但我想更多地解释一下它是如何工作的实际机制。
这是语法(根据标题):${1:-$(</dev/stdin)}
在上下文中,可以将其用作:
我最近在创建函数的上下文中遇到了这种非常简洁的语法,该bash
函数可以接受来自 STDIN 的参数或流(即可以通过管道传输到)。从表面上看,我了解这里发生了什么,但我想更多地解释一下它是如何工作的实际机制。
这是语法(根据标题):${1:-$(</dev/stdin)}
在上下文中,可以将其用作:
允许以下用法:
或者,您也可以这样做
这很棒,因为它是我见过的使用函数同时启用参数和管道功能的最简洁的方法bash
(不幸的是,我忘记了我现在在哪里遇到它)。
现在,我理解(或认为我理解),这里发生的大部分事情至少是表面上的,但我希望能有更深入的理解。以下是我对它的解释,然后是我剩下的问题:
${1:-$(</dev/stdin)}
${1}
显然是函数接受的默认参数
${1:-x}
'x'
如果$1
为空(或未设置?) ,则为字符串的变量/大括号扩展“回退” 。在这种情况下,回退到 STDIN 过程子。
$()
显然是进程命令替换
- 最后,
</dev/stdin
显然是来自标准输入的重定向,它允许管道工作。
这实质上是说如果$1
没有由参数填充,则回退到使用 STDIN——我在概念上很满意。
所以这是我的问题:
- 我从未在
进程<
命令替换中看到重定向( ),而在它之前没有实际命令(例如)。那么,当进程命令替换接收到重定向而没有其他命令可以调用时,实际发生了什么(本质) ?$(cat < somefile.ext)
- 为什么有必要将 STDIN 重定向包装在
进程命令替换中?(实际上,当我写这篇文章时,我突然想到我没有测试过它,但我会保持简单)。
- 这安全吗?我已经将它与多行标准输入一起使用,到目前为止它还没有损坏。这可能会落在哪里(如果有的话?)。
$(
.. )
:来自 bash 手册是命令替换而不是进程替换<(
.. )
。并从命令替换
命令替换 $(cat file) 可以替换为等效但更快的 $(< file)。
/dev/stdin
是一个符号链接/proc/self/fd/0
,在这里很方便,因为$(<
..)
需要一个文件的语法。
这可能会导致问题,因为该命令可能会被阻止,直到标准输入关闭。多行输入将被保留,因为 au 双引号是安全的。
最后为每个日志命令创建一个管道并分叉一个进程(如 in mv -v foo.ext bar.ext | log
)可能效率低下。
我最近在创建函数的上下文中遇到了这种非常简洁的语法,该bash
函数可以接受来自 STDIN 的参数或流(即可以通过管道传输到)。从表面上看,我了解这里发生了什么,但我想更多地解释一下它是如何工作的实际机制。
这是语法(根据标题):${1:-$(</dev/stdin)}
在上下文中,可以将其用作:
我最近在创建函数的上下文中遇到了这种非常简洁的语法,该
bash
函数可以接受来自 STDIN 的参数或流(即可以通过管道传输到)。从表面上看,我了解这里发生了什么,但我想更多地解释一下它是如何工作的实际机制。这是语法(根据标题):
${1:-$(</dev/stdin)}
在上下文中,可以将其用作:
允许以下用法:
或者,您也可以这样做
这很棒,因为它是我见过的使用函数同时启用参数和管道功能的最简洁的方法
bash
(不幸的是,我忘记了我现在在哪里遇到它)。现在,我理解(或认为我理解),这里发生的大部分事情至少是表面上的,但我希望能有更深入的理解。以下是我对它的解释,然后是我剩下的问题:
${1:-$(</dev/stdin)}
${1}
显然是函数接受的默认参数${1:-x}
'x'
如果$1
为空(或未设置?) ,则为字符串的变量/大括号扩展“回退” 。在这种情况下,回退到 STDIN 过程子。$()
显然是进程命令替换- 最后,
</dev/stdin
显然是来自标准输入的重定向,它允许管道工作。这实质上是说如果
$1
没有由参数填充,则回退到使用 STDIN——我在概念上很满意。所以这是我的问题:
- 我从未在
进程<
命令替换中看到重定向( ),而在它之前没有实际命令(例如)。那么,当进程命令替换接收到重定向而没有其他命令可以调用时,实际发生了什么(本质) ?$(cat < somefile.ext)
- 为什么有必要将 STDIN 重定向包装在
进程命令替换中?(实际上,当我写这篇文章时,我突然想到我没有测试过它,但我会保持简单)。- 这安全吗?我已经将它与多行标准输入一起使用,到目前为止它还没有损坏。这可能会落在哪里(如果有的话?)。
$(
..)
:来自 bash 手册是命令替换而不是进程替换<(
..)
。并从命令替换命令替换 $(cat file) 可以替换为等效但更快的 $(< file)。
/dev/stdin
是一个符号链接/proc/self/fd/0
,在这里很方便,因为$(<
..)
需要一个文件的语法。这可能会导致问题,因为该命令可能会被阻止,直到标准输入关闭。多行输入将被保留,因为 au 双引号是安全的。
最后为每个日志命令创建一个管道并分叉一个进程(如 in
mv -v foo.ext bar.ext | log
)可能效率低下。
bash - 连接 $ 和 var --> $var 时不显示 var 的值
到目前为止,我已经有大约一天的 bash 经验..
此脚本返回“ $h
”、“ $e
”、“ $l
”、“ $l
”、“ ” ,$o
但我实际上希望它返回变量的h
内容e
、、、l
和。l
o
我怎么做?
bash - 使用位置变量时是否可以解决 SC2001(“看看是否可以使用 ${variable//search/replace}”)?
我正在寻找一个单行来用变量替换替换变量字符串中变量位置的任何字符。我想出了这个工作解决方案:
一个示例用法:
不幸的是,当我使用包含我当前解决方案的脚本运行 shellcheck 时,它告诉我:
我想使用它所建议的参数扩展而不是管道到 sed,但我不清楚使用位置变量时的正确格式。官方文档似乎根本没有讨论字符串中的定位。
这可能吗?
bash - 使用带有必需检查的 Bash 参数扩展
我正在尝试剥离变量中的字符串值并使用 bash 参数扩展复制到另一个变量。
当我回显 initialModified 时,从初始变量中字符串的开头剥离 abc 后,这给了我 initialModified 中的值。
但是,除此之外,我想添加必需的检查
这不能按预期工作。并抛出错误。任何帮助表示赞赏。
bash - Bash 参数扩展无法匹配 $* 和 $@ 等变量中的空格
使用破折号(0.5.10.2),我可以这样做:
这是我所期望的行为。的内容$*
(由空格x hello world
指定set
并由空格分隔)通过外壳参数扩展运行以删除任何x
回声前导,从而导致hello world
,我用周围的括号呼应以证明缺少周围的空白。
我无法在 bash (5.0.2(1)-release) 中复制它。看来空间,一个分隔符,是不可访问的:
这里有解决方案吗?也许某种修改$*
或更改输出字段分隔符的方法?
我目前的解决方法是将它分配给一个临时变量,但这很难看。(我需要 bash,否则我会坚持使用 /bin/sh,它是 dash。)