在 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'