如何获取外壳命令的位置参数



示例 Bash 脚本:

#!/bin/bash
echo $0
echo $1

运行此为

$ ./prog foo

将打印:

./prog
foo

所以我知道如何在 shell 程序中获取位置参数。

我想弄清楚的是,如何对任何其他 shell 命令执行相同的操作。像mv,例如,我希望能够说

mv file1 .file1.bak

但是我不想两次都输入file1。

我尝试了与上面的外壳脚本相同的方法。

$ echo a b c $0 $1 $2

但是这个印刷

a b c -zsh

我认为这可能只是一个特定于外壳的东西,所以我在bash中运行了它。

a b c bash

TL;DR:如何在扩展中从 shell 命令中获取位置参数?

您可以使用以下方法之一:

!^      first argument
!$      last argument
!*      all arguments
!:2     second argument
!:2-3   second to third arguments
!:2-$   second to last arguments
!:2*    second to last arguments
!:2-    second to next to last arguments
!:0     the command
!!      repeat the previous line

前任:

echo a b c d e
> a b c d e
echo !$
> echo e
> e
echo "a" "b" "c" "d" "e"
> a b c d e
echo "!:2"
> echo ""b""
> b

这些是操纵 bash 历史的命令。

(我看到你在用zsh,但我给你一个bash答案(

您可以使用 bash 历史扩展来提取第一个参数。在这里,使用echo而不是mv进行演示:

$ echo file1 .!#:1.bak
echo file1 .file1.bak
file1 .file1.bak

哪里

  • !#是到目前为止您键入的当前行
  • :1是当前行中的第一个参数

如果您不需要前导点,大括号扩展也是一个不错的选择

$ echo file1{,.bak}
file1 file1.bak

最新更新