変数に改行文字(POSIX)が含まれているかどうかをテストする

変数に改行文字(POSIX)が含まれているかどうかをテストする

私はいくつかのシェルがこの種のテストを可能にすることを知っています。

t() { [[ $var == *$'\n'* ]] && res=yes || res=no
      printf '%s ' "$res";
    }

var='ab
cd'
t
var='abcd'
t
echo

実行時:

$ bash ./script
yes no
  1. POSIXに対応するタスクは何ですか(ダッシュ)

  2. 次のテスト方法は信頼できますか?

    nl='
    '
    
    t() {  case "$var" in
               *$nl* ) res=yes ;;
               * ) res=no ;;
           esac
           printf '%s ' "$res"
         }
    
    var='ab
    cd'
    t
    var='abcd'
    t
    echo
    

ベストアンサー1

変数に新しい行を入れてパターンマッチングを実行できますcase

$ cat nl.sh
#!/bin/sh
nl='
'
case "$1" in
    *$nl*)  echo has newline ;;
    *)      echo no newline  ;;
esac

$ dash nl.sh $'foo\nbar'
has newline
$ dash nl.sh $'foobar'
no newline

改行を作成する別の方法は次のとおりです。

nl=$(printf "\nx"); nl=${nl%x}

明らかなコマンド置換は、置換が末尾の改行を削除するため、機能しません。

おすすめ記事