web-dev-qa-db-ja.com

Bashの長い文字列、Word分割なし?

長いコマンドでスクリプトを整理したいので、たとえば次のようにします。

{ somecheck || somecomand "reallyreallyreallyreallyreallyreallylongstring" } &> /dev/null &

次のようになります:

{ somecheck ||                   \
    somecomand "reallyreally"    \
        "reallyreally"           \
        "reallyreally"           \
        "longstring"             \
} &> /dev/null &

しかし、単語の分割が心配です。それを避けるために、私はこれを検討しています:

{ somecheck ||                   \
    somecomand  "$(echo          \
        "reallyreally"           \
        "reallyreally"           \
        "reallyreally"           \
        "longstring"             \
    )"                           \
} &> /dev/null &

Bash/zshで複数行の文字列を実行する他の方法を知っている人はいますか?この情報をグーグル検索するのに問題があります。これは少なくとも3つのプロセス(スクリプト、バックグラウンドブロック、およびコマンド置換サブシェル)を意味すると思います。多分もっと良い方法がありますか?

前もって感謝します!

6
ferhtgoldaraz

このような行の継続を使用すると、文字列にスペースが追加されます。シーケンスbackslash-newline-whitespaceは1つのスペースに置き換えられます。

変数を使用するだけで、読みやすさが向上します。

url="reallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongstring"
{ somecheck || somecomand "$url" } &> /dev/null &

配列を使用して、それを部分文字列に分割することもできます

parts=(
    "reallyreallyreallyreally"
    "reallyreallyreallyreally"
    "reallyreallyreallyreally"
    "reallyreallyreallyreally"
    "longstring"
)
whole=$(IFS=; echo "${parts[*]}")

しかし、追加された複雑さを考慮して、リテラル文字列を分割することはそれほど重要ですか?

6
glenn jackman

さて、あなたはそれを少し単純化して次のようにすることができます:

$ [ -f /dev/null ] || sed 's/a/A/g' <(echo "thisis""avery"\
"long""string"\
"Ihave""separated"\
"into""smaller"\
"substrings")
thisisAverylongstringIhAvesepArAtedintosmAllersubstrings

重要な点は、入力文字列に余分な空白を入れないことです。したがって、\の周りに空白を入れないでください。

変数を使用するというGlennの提案は、より美しく、より単純ですが、それに合わせてください。

2
terdon

Glennの2つの提案の中間にあるアプローチを提案します。(単純なスカラー)変数を使用しますが、その定義を複数の行に分割します。

myword="super"
myword="${myword}cali"
myword="${myword}fragil"
myword="${myword}istic"
myword="${myword}expi"
myword="${myword}ALi"
myword="${myword}docious"
0
Scott