如何比较 UNIX shell 脚本中的 2 个字符串?

Dev*_*ith 5 string shell-script

我有一个存储字符串的变量,即 sed 命令的输出。仅当此字符串值与其他 2 个字符串中的任何一个匹配时,我才想执行一组命令。

我使用了下面的代码。

#! /bin/ksh
request=”Request”
fault=”Fault”
while read lines; do
    category=`echo $lines|sed -n -e 's/.*Summary: Value//p'| awk '{print $1}'`
    if [ ! -z "$category" ]
    then
        if($category = $request)
        then
            echo $category
        fi
     fi
done<content.txt
Run Code Online (Sandbox Code Playgroud)

但它给了我一个错误:

sample.sh: Request: not found
Run Code Online (Sandbox Code Playgroud)

变量类别将具有值Request或值Order

有人可以指出错误或解决方案吗?

如果消除内部 ifecho $category并将打印确切的字符串值。

Kiw*_*iwy 14

这样做的简单答案您可以使用以下语法:

if [ "$category" = "$request" ]
Run Code Online (Sandbox Code Playgroud)

间距很重要。旁注,您应该使用最近的命令替换和替换方式(请参阅文章 1posix 文章):

category=`echo $lines|sed -n -e 's/.*Summary: value//p'| awk '{print $1}'`
Run Code Online (Sandbox Code Playgroud)

这样

category=$(echo $lines|sed -n -e 's/.*Summary: value//p'| awk '{print $1}')
Run Code Online (Sandbox Code Playgroud)


Kus*_*nda 11

其他人已经指出了您if语句中的语法错误。

我还想评论一个事实,即您似乎使用印刷双引号,,而不是普通的,"。您也不需要sed通过该命令替换将 的输出存储在单独的变量中。相反,awk直接从输出中读取:

#!/bin/ksh

sed -n 's/.*Summary: Value//p' <content.txt | awk '{ print $1 }' |
while IFS= read -r category; do
    case $category in
        Request|Fault)
            printf '%s\n' "$category"
            ;;
        Breakfast)
            echo 'Yum'
            ;;
        *)
            printf 'Unknown category: %s\n' "$category"
    esac
done
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢使用if-statements,

#!/bin/ksh

sed -n 's/.*Summary: Value//p' <content.txt | awk '{ print $1 }' |
while IFS= read -r category; do
    if   [ "$category" = 'Request' ] || [ "$category" = 'Fault' ]; then
        printf '%s\n' "$category"
    elif [ "$category" = 'Breakfast' ]; then
        echo 'Yum'
    else
        printf 'Unknown category: %s\n' "$category"
    fi
done
Run Code Online (Sandbox Code Playgroud)

请注意,不需要测试字符串是否为空。只要您始终引用变量 expand,就可以将空字符串与另一个字符串进行比较而不会出现问题。

或者,如果您的脚本除此之外什么都不做:

#!/bin/ksh

sed -n 's/.*Summary: Value//p' <content.txt | awk '
    $1 == "Request" || $1 == "Fault" { print $1;    next }
    $1 == "Breakfast"                { print "Yum"; next }
                                     { printf("Unknown category: %s\n", $1) }
Run Code Online (Sandbox Code Playgroud)

有关的:


Siv*_*iva 5

我们应该使用[代替(in if 条件

尝试:

 if [ "$category" = "$request" ]
Run Code Online (Sandbox Code Playgroud)
  • () 用于执行命令并检查退出代码。
  • [] 用于检查表达式。

我希望你已经从 MS-word 复制了脚本,因为它具有非 unix 字符

request=”Request”
fault=”Fault”
Run Code Online (Sandbox Code Playgroud)

将此编辑为

request="Request"
fault="Fault"
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

18977 次

最近记录:

7 年,2 月 前