在Bash命令中,!#:*和!#:1-的含义是什么?

4
在下面的Bash命令中,!#:* !#:1的含义是什么?
echo "This is a sentence." !#:* !#:1- >text3

http://ss64.com/bash/bang.html - Thomas Ruiz
4
仅在交互模式下可用的东西真的算作编程问题吗?我倾向于认为,大多数将Bash问题迁移到SuperUser的呼声往往不正确,但这是一个特殊情况,因为被问及的东西仅可在脚本之外使用,对编程来说完全无用。 - Charles Duffy
@CharlesDuffy 个人而言,我会选择:http://unix.stackexchange.com/ - Adam Jensen
如果我的问题对您来说不够有趣或者不够重要,我深表歉意。 - Adalid_Negro
2个回答

8

它使用bash的历史替换机制

具体来说,!# 指代当前行(但不包括 !# 本身所在的位置)。!#:* 是该行命令名后面的部分(因此,在本例中,是 "This is a sentence.")。!#:1-!#:* 相同,只是省略了最后一个单词(因此,它不包括我们刚刚通过 !#:* 添加的第二个 "This is a sentence" 副本)。

最终结果是将三个 This is a sentence. 的副本回显到名为 text3 的文件中。


6

来自的输出:

echo "hello" !#        

相当于以下输出结果:

echo "hello" echo "hello"

which is:

hello echo hello

!# 意味着将之前的字符串再次替换到当前行(快捷方式,避免重复编写)

     0th    1st     2nd      3rd
-------- ------- ------ --------
    echo "hello"   echo  "hello"
-------- ------- ------  -------

!#:0 表示替换第0列的值

!#:1 表示替换第1列的值

例如

echo "hello" !#:1

这个输出结果与以下代码的输出结果相同:

echo "hello" "hello"

which is:

hello hello

!#:1将被第一列中的字符串"hello"替换

echo "hello" !#:0

生成的输出与以下内容相同:

echo "hello" echo

which is:

hello echo

!#:0会被0列中的字符串替换 — echo


1
这并没有解释 :* 的意思是“从第0列开始的所有内容(从第1列开始)”,而 :1- 的意思是“从第1列开始但不包括最后一列的所有内容”。 - Mark Reed
这是一个有用的参考链接:https://www.gnu.org/software/bash/manual/html_node/Word-Designators.html - waldyrious

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接