GNU/Linux >> Linux の 問題 >  >> Linux

bashで非常に長い文字列リテラルを分割するにはどうすればよいですか?

bash スクリプトの先頭に短い strcat 関数を定義し、インライン呼び出しを使用して物事を分割します。コマンド呼び出しでインラインで長いリテラルを定義できるため、個別の変数を使用するよりも、この方法を好む場合があります。

function strcat() {
  local IFS=""
  echo -n "$*"
}

mycommand \
  --server myserver \
  --filename "$(strcat \
      extremely/long/file/name/ \
      that/i/would/like/to/be/able/to/break/ \
      up/if/possible)" \
  --otherflag \
  --anotherflag \

また、フラグ パラメータとして値の長い CSV を入力する必要がある場合にも、このアプローチが気に入っています。これを使用すると、値の間にコンマを入力する必要がなくなるからです。

function strjoin() {
  local IFS="$1"
  shift
  echo -n "$*"
}

csv_args=(
  foo=hello
  bar=world
  "this=arg  has  spaces  in  it"
)
mycommand \
  --server myserver \
  --csv_args "$(strjoin , "${csv_args[@]}")" \
  --otherflag \
  --anotherflag \

これは

と同等です
mycommand \
  --server myserver \
  --csv_args "foo=hello,bar=world,this=arg  has  spaces  in  it" \
  --otherflag \
  --anotherflag \

変数を使用できます:

file=extremely/long/file/name
file+=/that/i/would/like/to/be/able/to/break
file+=/up/if/possible

mycommand\
    --server myserver\
    --filename $file\
    --flag flag

配列変数を使用することもできます

file=(extremely/long/file/name
    /that/i/would/like/to/be/able/to/break
    /up/if/possible)
IFS=''

echo mycommand\
    --server myserver\
    --filename "${file[*]}"\
    --flag flag

少しです ハックしますが、これは機能します:

mycommand \
    --server myserver \
    --filename "extremely/long/file/name/"`
               `"that/i/would/like/to/be/able/to/break/"`
               `"up/if/possible" \
    --otherflag \
    --anotherflag

Bash は隣接する文字列リテラルを連結するので、それを利用します。例:echo "hi" "there" hi there を出力します 一方 echo "hi""there" hithere を出力します .

また、バックティック演算子と、一連のスペースが何も評価されないという事実も利用しています。


Linux
  1. Bashスクリプトをデバッグする方法は?

  2. Bashの文字列/配列から一意の要素の配列を作成するにはどうすればよいですか?

  3. バッシュを検出する方法>=4.0?

  1. Bashで文字列を16進数として読み取る方法は?

  2. Bashスクリプトで文字列を分割する方法

  3. 文字列にBashの部分文字列が含まれているかどうかを確認する方法

  1. Bashでループを作成する方法

  2. cat << EOFはbashでどのように機能しますか?

  3. 変数を使用してBashを使用して複数行の文字列を記述する方法は?