コマンドラインで作業するとBashスクリプトが失敗する

コマンドラインで作業するとBashスクリプトが失敗する

文字列検索パラメータが別の文字列に表示されるかどうかをテストするための基本的なbash関数を作成しました。コマンドラインから実行すると、予想される結果が表示されます。シェルスクリプトで同じコマンドを実行すると失敗します。誰かが私のアプローチにどのような問題があるのか​​教えてもらえますか?

me@mylaptop $ line='someidentifier 123                     another identifier 789 065             theend'
me@mylaptop $ sarg='+([0-9])+([ ])another identifier'
me@mylaptop $ type strstr
strstr is a function
strstr ()
{
   [ "${1#*$2*}" = "$1" ] && return 1;
   return 0
}
me@mylaptop $ strstr "$line" "$sarg" ; echo "$?"
0
me@mylaptop $

私のスクリプト:

me@mylaptop $ cat l.sh
#!/bin/bash

function strstr ()
{
   [ "${1#*$2*}" = "$1" ] && return 1;
   return 0
}

line='someidentifier 123                     another identifier 789 065             theend'
sarg='+([0-9])+([ ])another identifier'

echo '==='"$line"'==='

echo '==='"$sarg"'==='

strstr "$line" "$sarg"

echo "$?"

me@mylaptop $ ./l.sh
===someidentifier 123                     another identifier 789 065             theend===
===+([0-9])+([ ])another identifier===
1
me@mylaptop $

ベストアンサー1

対話型シェルではシェルオプションを有効にしましたが、extglobスクリプトでは有効にしませんでした。

$ strstr "$line" "$sarg" ; echo "$?"
1
$ shopt -s extglob
$ strstr "$line" "$sarg" ; echo "$?"
0

関数は次のように単純化できます。

strstr () {
    [ "${1#*$2*}" != "$1" ]
}

おすすめ記事