Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何在bash中剪切现有变量并分配给新变量_Linux_Bash - Fatal编程技术网

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

Linux 如何在bash中剪切现有变量并分配给新变量,linux,bash,Linux,Bash,我想在cut命令中使用VAR变量,但是,当我这样使用时,它会说 !/bin/bash VAR=$(some curl commands) token =$(cut -c 18-53 $VAR) echo $token 我只想把curl命令的VARoutput从18.char减少到53.char。有什么建议吗?让我们定义一个示例变量: 现在,让我们使用剪切选择字符18到53: 构造${var:17:36}称为子字符串扩展。它从位置17开始选择36个字符。在bash中,与cut不同,第一个字符的编

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

!/bin/bash
VAR=$(some curl commands)
token =$(cut -c 18-53 $VAR)
echo $token
我只想把curl命令的VARoutput从18.char减少到53.char。有什么建议吗?

让我们定义一个示例变量:

现在,让我们使用剪切选择字符18到53:

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

当然,我们可以将所选字符串指定给变量:

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

或:

提出了另一种POSIX方法,该方法避免了外部进程:

$ token=$(echo "$var" | cut -c 18-53)
$ echo "$token"
ox jumped over the lazy dog on the w
cut和bash子串扩展的比较 正如评论中指出的,使用bash的内部字符串处理有很大的优势。一是使用bash的内部命令可以避免产生额外的子shell和可执行文件。如果在一个循环中产生额外的子shell,这会极大地影响性能


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

您不能在token和=之间加空格老实说,我没有看到$VAR在cut anywhere中使用。转到您的终端,键入man bash,搜索参数展开部分,然后查找${Parameter:offset:length}。这就是所谓的子字符串扩展,并且有很好的文档记录。out应该是$VAR。当我尝试使用txt文件时,我忘了使用它/bin/bash非常重要。您当前的shebang传统上会导致脚本文件由csh执行,这与Bash不兼容。使用字符串索引而不是命令替换和剪切的好处是,通过使用Bash提供的内置功能,您可以避免产生额外的子shell。如果在一个循环中产生额外的子shell,这将极大地影响性能@Jon1024-我知道你知道,这只是为了OP的好处,只是为了澄清为什么原始版本不起作用:cut希望它的参数是一个要读取的文件名,而不是一个要操作的字符串。John1024的版本没有给它一个文件名,cut隐式地将其视为对其标准输入进行操作的意思,而不是常规文件,然后使用here字符串将该字符串传递给cut的标准输入。更传统的方法是echo$var | cut-c 18-53-这甚至更慢,但在bash以外的shell中也可以使用。@DavidC.Rankin很好!非常感谢。“我已经在答案中添加了这一点。@戈登戴维森也有很好的观点!我已经在答案中添加了您的POSIX版本。请注意,除非GNU cut与-z选项一起使用,否则cut可以在行上工作,然后在空分隔字段上工作。因此,如果变量可能包含换行符,并且您确实需要完整变量的子字符串,那么切割解决方案是不可行的。POSIX方法可以是printf和参数扩展的组合:printf'%.36s\n'${var'.}当然,可以通过编程方式生成长的?'s链。但是你很高兴这个问题被标记了!
$ echo $(cut -c 18-53 <<<"$var")
ox jumped over the lazy dog on the w
$ echo ${var:17:36}
ox jumped over the lazy dog on the w
$ 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
$ 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
$ printf '%.36s\n' "${var#?????????????????}"
ox jumped over the lazy dog on the w