POSIX は Case ステートメントで改行をキャプチャします。

POSIX は Case ステートメントで改行をキャプチャします。

POSIXシェルのCaseステートメント変数が複数行(ダッシュ)かどうかをキャプチャしたいと思います。

私はこれを試しました:

q='
'
case "$q" in
    *$'\n'*) echo nl;;
    *) echo NO nl;;
esac

nlzshとして返されますが、ダッシュNO nlでは返されません。

ありがとうございます。

ベストアンサー1

シェルにはdashC文字列()はありません$'...'。 C 文字列は POSIX 標準の拡張です。リテラルの改行を使用する必要があります。改行文字を変数に保存すると、簡単で見やすくなります。

#!/bin/dash

nl='
'

for string; do

    case $string in
        *"$nl"*)
            printf '"%s" contains newline\n' "$string"
            ;;
        *)
            printf '"%s" does not contain newline\n' "$string"
    esac

done

スクリプトに提供されている各コマンドライン引数に改行文字が含まれていることを確認してください。caseステートメント()で使用される変数には$string引用符は必要なく、;;最後のラベルcaseの後にも必要ありません。

テスト(セカンダリプロンプトが表示される対話型シェルzshから):dquote>

$ dash script.sh "hello world" "hello
dquote> world"
"hello world" does not contain newline
"hello
world" contains newline

おすすめ記事