Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Awk Shell编程中变量的匹配模式_Awk_Printf - Fatal编程技术网

Awk Shell编程中变量的匹配模式

Awk Shell编程中变量的匹配模式,awk,printf,Awk,Printf,似乎我一直得到-gt或==错误,如下所示。有人能帮忙吗 flag= echo $flightSeatBooked | awk -F[,] '{print match($flightSeatBooked, $orderSeats)}' if $flag == 0; then echo "Success"; else echo "fail"; 鉴于: flightSeatBooked= 9;,A1,A2,A3,A4,B2,E4,C3,B3,D3,D2,E1,E2,C

似乎我一直得到-gt或==错误,如下所示。有人能帮忙吗

flag= echo $flightSeatBooked | awk -F[,] '{print match($flightSeatBooked, $orderSeats)}'
if $flag == 0; then
        echo "Success";
else
        echo "fail";
鉴于:

flightSeatBooked= 9;,A1,A2,A3,A4,B2,E4,C3,B3,D3,D2,E1,E2,C2,B4,C4,D4,C1,D1,E3,B1
orderSeats= B2 (not found in the variable)
预期产出:
成功

犯了不少错误。更改如下:

flag=$(echo $flightSeatBooked | awk -v flseat=$flightSeatBooked -v orseat=$orderSeats '{print match(flseat, orseat)}')

if [ $flag -eq 0 ]; then
        echo "Success";
else
        echo "fail";
fi
awk -v flseat="$flightSeatBooked" -v orseat="$orderSeats" 'BEGIN{exit index(flseat, orseat)}')

if [ $? -eq 0 ]; then
        echo "Success"
else
        echo "fail"
fi
case "$flightSeatBooked" in
   *"$orderSeats"* ) echo "fail";;
   * ) echo "Success" ;;
esac
  • 命令替换已使用$(…)表示法完成
  • 在awk中直接使用shell变量不是一种好的做法,因此使用-v将shell变量传递给awk
  • 的语法(如果使用)不正确,请更新以更正它

  • 您还可以使用下面的选项检查$orderSeats是否在$flightseatook中。如果在中,则返回匹配字符串的长度,或者返回0

    expr "$flightSeatBooked" : ".*,${orderSeats},"
    

    以下是如何满足您的要求:

    flag=$(awk -v flseat="$flightSeatBooked" -v orseat="$orderSeats" 'BEGIN{print index(flseat, orseat)}')
    
    if [ $flag -eq 0 ]; then
            echo "Success"
    else
            echo "fail"
    fi
    
    但我不认为你问的是个好主意。至少应该是这样的:

    flag=$(echo $flightSeatBooked | awk -v flseat=$flightSeatBooked -v orseat=$orderSeats '{print match(flseat, orseat)}')
    
    if [ $flag -eq 0 ]; then
            echo "Success";
    else
            echo "fail";
    fi
    
    awk -v flseat="$flightSeatBooked" -v orseat="$orderSeats" 'BEGIN{exit index(flseat, orseat)}')
    
    if [ $? -eq 0 ]; then
            echo "Success"
    else
            echo "fail"
    fi
    
    case "$flightSeatBooked" in
       *"$orderSeats"* ) echo "fail";;
       * ) echo "Success" ;;
    esac
    
    你可能真正需要的是这样的东西:

    flag=$(echo $flightSeatBooked | awk -v flseat=$flightSeatBooked -v orseat=$orderSeats '{print match(flseat, orseat)}')
    
    if [ $flag -eq 0 ]; then
            echo "Success";
    else
            echo "fail";
    fi
    
    awk -v flseat="$flightSeatBooked" -v orseat="$orderSeats" 'BEGIN{exit index(flseat, orseat)}')
    
    if [ $? -eq 0 ]; then
            echo "Success"
    else
            echo "fail"
    fi
    
    case "$flightSeatBooked" in
       *"$orderSeats"* ) echo "fail";;
       * ) echo "Success" ;;
    esac
    

    检查逻辑(我没有!),但希望您能找到方法。

    如果orderSeats=B2,那么它在$flightseathooked中,对吗?脚本中唯一一行没有语法错误的是说
    else
    ,所以我猜你是新来的shell脚本,所以你用这种方式混合shell和awk的方法可能不是最好的。如果你告诉我们你想做什么,我们可以提供建议。如果任何变量包含空格、全局字符或重元字符,这将失败。始终引用变量,在awk脚本中使用index()而不是match(),并去掉echo和pipe,将index()调用移动到一个开始带有出口的BEGIN部分。基本上整个事情都应该重写。