if 语句失败内的 cut 命令

if 语句失败内的 cut 命令

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

假设$VAR1 = "ABCDEFGHIJKLMN.csv"

if [ "$VAR1"| cut -c 7-18 = "GHIJKLMN.csv" ]; then
..do stuff..

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

有谁知道为什么这行不通吗?

答案1

if [ "$VAR1"| cut -c 7-18 = "GHIJKLMN.csv" ]; then

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

我猜你想要的是:

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

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

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

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

这样可以避免对 echo 进行特殊解释$VAR1(根据内容,可能会将其误认为选项),以及调用 2 个不必要的可执行文件[echo。这里需要特别注意的是,您实际上不需要我使用的任何引号。[[是 bash 的特殊语法,即使替换中有空格,bash 也不会对其进行分词。它也不会拆分给出的内容<<<GHIJKLMN.csv没有任何空格或特殊字符,因此也没问题。但是,如果有疑问,最好将所有内容都加引号。

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

if [[ "${VAR1:6:12}" = "GHIJKLMN.csv" ]]; then

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

我刚刚看到,你的$VAR1"ABCDEFGHIJKLMN.csv"。由于你切到了最后,所以你实际上不需要指定计数:

if [[ "${VAR1:6}" = "GHIJKLMN.csv" ]]; then

答案2

这有效:

#!/bin/bash

echo 'Beginning of script'
VAR1='ABCDEFGHIJKLMN.csv'
if [ $(echo "$VAR1" | cut -c 7-18) == "GHIJKLMN.csv" ]; then
    echo 'If condition triggered.'
fi
echo 'End of script'

这也有效:

#!/bin/bash

echo 'Beginning of script'
VAR1='ABCDEFGHIJKLMN.csv'
VAR2=$(echo "$VAR1" | cut -c 7-18)
if [ "$VAR2" == "GHIJKLMN.csv" ]; then
    echo 'If condition triggered.'
fi
echo 'End of script'

相关内容