!/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。有什么建议吗?
答案 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
以上命令在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的内部字符串处理可以避免这种副作用。