在 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
结果与我正在比较的字符串完全相同。
有没有人知道为什么这不起作用?
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)
这避免了对$VAR1
by 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)
归档时间: |
|
查看次数: |
8693 次 |
最近记录: |