如何在bash中剪切现有变量并分配给新变量

时间:2017-11-21 05:45:36

标签: linux bash

!/bin/bash
VAR=$(some curl commands)
token =$(cut -c 18-53 $VAR)
echo $token

我想在剪切命令中使用VAR变量,但是,当我这样使用时,它会说;

No such file or directory

我只想将VAR(curl命令的输出)从18.char切割到53.char。有什么建议吗?

1 个答案:

答案 0 :(得分:6)

让我们定义一个示例var

$ var='The quick brown fox jumped over the lazy dog on the way to the market'

现在让我们使用cut选择字符18到53:

$ echo $(cut -c 18-53 <<<"$var")
ox jumped over the lazy dog on the w

因为cut期望从标准输入读取(如果不是文件),我们使用<<<告诉bash在标准输入上提供$var的内容。这称为 here string

或者,我们可以单独使用bash选择相同的字符:

$ echo ${var:17:36}
ox jumped over the lazy dog on the w

构造${var:17:36}称为子串扩展。它从位置17开始选择36个字符。(在bash中,与cut不同,第一个字符编号为零。)

我们当然可以将所选字符串分配给变量:

$ token=${var:17:36}
$ echo "$token"
ox jumped over the lazy dog on the w

或者:

$ token=$(cut -c 18-53 <<<"$var")
$ echo "$token"
ox jumped over the lazy dog on the w

POSIX

以上命令在bash中有效。如果我们想要POSIX shell的可移植性,那么我们既不能使用子串扩展也不能使用这里的字符串。相反,正如Gordon Davisson指出的那样,我们可以使用:

$ echo "$var" | cut -c 18-53
ox jumped over the lazy dog on the w

或:

$ token=$(echo "$var" | cut -c 18-53)
$ echo "$token"
ox jumped over the lazy dog on the w

gniourf_gniourf提出了另一种POSIX方法,这种方法避免了外部过程:

$ printf '%.36s\n' "${var#?????????????????}"
ox jumped over the lazy dog on the w

cut和bash子字符串扩展

的比较

正如David C. Rankin在评论中指出的那样,使用bash的内部字符串处理有很大的优势。一个是使用bash的内部命令可以避免产生额外的子shell和可执行文件。如果在循环中生成其他子shell,则会极大地影响性能。

此外,命令替换具有从其输出中删除尾随换行符的副作用。这可能会导致不必要的意外。使用bash的内部字符串处理可以避免这种副作用。