如何使用 awk 方法在 bash 脚本上实现 startsWith 函数

How to use awk method to implement the startsWith function on bash script

我正在尝试使用 awk 在 bash 脚本中实现 startsWith 函数,但它不起作用。

https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html

#! /bin/bash


starts_with()
{
    local string=
    local substring=
    
    local index=$(printf "%s" "$string" | awk 'BEGIN { print index("$string", "$substring") }')
    
    if [[ "$index" == "1" ]]
    then
        echo "true" : $string : $substring
    else
        echo "false" : $string : $substring
    fi
}

starts_with key1="value" key1=
starts_with key2="value" wrong_key=

这是输出:

false : key1=value : key1=
false : key2=value : wrong_key=

但是 awk 页面说:

index(in, find)

    Search the string in for the first occurrence of the string find, and return the position in characters where that occurrence begins in the string in. Consider the following example:

    $ awk 'BEGIN { print index("peanut", "an") }'
    -| 3

    If find is not found, index() returns zero.

    With BWK awk and gawk, it is a fatal error to use a regexp constant for find. Other implementations allow it, simply treating the regexp constant as an expression meaning ‘[=13=] ~ /regexp/’. (d.c.)

上面的starts_with函数有什么问题,如何解决?

如果可以直接在 bash?

中使用 awk 就没有意义了
#!/bin/bash
starts_with() {
    local string=""
    local substring=""

    if [[ $string == "$substring"* ]]
    then
        echo "true : $string : $substring"
    else
        echo "false : $string : $substring"
    fi
}
awk 'BEGIN { print index("$string", "$substring") }'

你不能在 GNU AWK 命令中像这样使用你的 shell 变量考虑简单的例子

string="HELLOWORLD" && awk 'BEGIN{print "$string"}' emptyfile.txt

输出

$string

观察文字 $string 出现,如果你想将 shell 中浮动的变量 ram 到 GNU AWK 命令中,例如使用 -v

string="HELLOWORLD" && awk -v s=$string 'BEGIN{print s}' emptyfile.txt

输出

HELLOWORLD

(在 GNU Awk 5.0.1 中测试)

如果您不介意额外输入,也可以将其导出:

export string="HELLOWORLD" && mawk '

BEGIN { 
       print ENVIRON["string"]
}'

HELLOWORLD

如果你不想导出,我想这也行

% string2="HELLOWORLD" mawk '

  BEGIN{ 

    print ENVIRON["string2"] 

  }' | gtee >( gpaste - \
    \
     | gsed -zE 's/^/ orig from pipe :: /' >&2;) | gcat -n       
           
     1  HELLOWORLD
 orig from pipe :: HELLOWORLD 

我不知道 Linux 和其他人的剪贴板机制是如何工作的,但如果你碰巧在 macOS 上,而你想引入的 shell 变量是不要太复杂,这是另一种方法:

pbcopy <<<"${TERM_SESSION_ID}" ;

mawk 'BEGIN { 
              (__=" pbpaste ") | getline _;
         close(__) 

print "pasting via macos clipboard ::", (_) }' | lgp3

pasting via macos clipboard :: BEC24EEE-B6B3-4862-A286-1953FB6438A7

如果您希望 getline 是单个语句,那么也许

 mawk ' BEGIN { 
 
   printf(" pasting via macos clipboard :: %*s",
            close((__="pbpaste")|getline _)<"",_) 
 
 }' | lgp3 

 pasting via macos clipboard :: BEC24EEE-B6B3-4862-A286-1953FB6438A7