Posix

POSIX 在 case 語句中擷取換行符

  • November 17, 2020

我想在POSIX shell(破折號)的case語句中捕捉變數是否是多行的。

我試過這個:

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

nl以 zsh 形式返回,但NO nl以破折號形式返回。

謝謝。

dashshell 沒有 C 字元串 ( ) $'...'。C-strings 是 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

引用自:https://unix.stackexchange.com/questions/549694