if 语句中的 cut 命令失败

mat*_*tv1 3 bash scripts

在 bash 脚本中,我有一个 if 语句。该语句评估字符串的特定部分(包含在变量中)是否等于另一个字符串。我使用cut命令来隔离要比较的字符串部分。我尝试了几种不同的选择,但这是我认为应该工作的选择。但它没有:

让我们说 $VAR1 = "ABCDEFGHIJKLMN.csv"

if [ "$VAR1"| cut -c 7-18 = "GHIJKLMN.csv" ]; then
..do stuff..
Run Code Online (Sandbox Code Playgroud)

只是为了确保我已经测试了 的输出,"$VAR1"| cut -c 7-18结果与我正在比较的字符串完全相同。

有没有人知道为什么这不起作用?

JoL*_*JoL 6

if [ "$VAR1"| cut -c 7-18 = "GHIJKLMN.csv" ]; then
Run Code Online (Sandbox Code Playgroud)

它的作用是执行[ "$VAR1"并将输出通过管道传输到cut -c 7-18 = "GHIJKLMN.csv" ]. [会失败,因为它要求它的最后一个参数是],并且cut会失败,因为可能既不是文件=也不]是文件。

我猜你想要的是:

if [ "$(echo "$VAR1" | cut -c 7-18)" = "GHIJKLMN.csv" ]; then
Run Code Online (Sandbox Code Playgroud)

请注意我如何将命令包装在"$()". 这会导致它执行并用输出替换它的位置。引号很重要,因此输出不会拆分为 的多个参数[

按照我认为的 bash 最佳实践,我建议这样做:

if [[ "$(cut -c 7-18 <<< "$VAR1")" = "GHIJKLMN.csv" ]]; then
Run Code Online (Sandbox Code Playgroud)

这避免了对$VAR1by echo 的特殊解释(取决于内容,它可能会将其误认为选项),并调用 2 个不必要的可执行文件[echo. 这里要特别注意的是,您实际上并不需要我使用的任何引号。[[是 bash 的一种特殊语法,即使替换中有空格,bash 也不会对其进行分词。它也不会拆分给<<<. GHIJKLMN.csv没有任何空格或特殊字符,所以也可以。但是,当有疑问时,引用所有内容是一个好习惯。

您也可以cut通过执行以下操作跳过调用:

if [[ "${VAR1:6:12}" = "GHIJKLMN.csv" ]]; then
Run Code Online (Sandbox Code Playgroud)

现在,一切都在 bash 中完成,无需执行任何其他程序。在此语法中,您不是像之前那样给出您想要的字符范围,而是cut提供第一个字符的基于 0 的偏移量和您想要的字符数。这是 7 - 1,因为cut的索引从 1 开始,而 12 是因为范围 7-18 包含在内,所以 18 - 7 + 1。

我刚看到,你的$VAR1"ABCDEFGHIJKLMN.csv"。既然你切到最后,你真的不需要指定计数:

if [[ "${VAR1:6}" = "GHIJKLMN.csv" ]]; then
Run Code Online (Sandbox Code Playgroud)