GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara memecah string literal yang sangat panjang di bash?

Saya mendefinisikan fungsi strcat pendek di bagian atas skrip bash saya dan menggunakan doa sebaris untuk memisahkan semuanya. Terkadang saya lebih suka menggunakan variabel terpisah karena saya dapat mendefinisikan literal panjang yang sejalan dengan pemanggilan perintah.

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 \

Saya juga menyukai pendekatan ini ketika saya harus memasukkan nilai CSV yang panjang sebagai parameter flag karena saya dapat menggunakannya untuk menghindari mengetik koma di antara nilai:

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 \

Yang setara dengan

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

Anda dapat menggunakan variabel :

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

Seseorang juga dapat menggunakan variabel array

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

Ini sedikit retas, tetapi ini berhasil:

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

Bash menggabungkan string literal yang berdekatan, jadi kami memanfaatkannya. Misalnya, echo "hi" "there" mencetak hi there sedangkan echo "hi""there" mencetak hithere .

Ini juga memanfaatkan operator backtick, dan fakta bahwa sekumpulan spasi tidak menghasilkan apa-apa.


Linux
  1. Cara menulis loop di Bash

  2. Bagaimana Cara Men-debug Skrip Bash?

  3. Bagaimana Cara Membuat Array Elemen Unik Dari String/array Di Bash?

  1. Cara Memisahkan String dalam Skrip Bash

  2. Cara Memeriksa apakah String Berisi Substring di Bash

  3. Bagaimana cara kerja cat << EOF di bash?

  1. Bagaimana Cara Mendeteksi Bash>=4.0?

  2. Bagaimana Cara Membaca String Sebagai Angka Hex Di Bash?

  3. Di Bash, bagaimana cara menambahkan string setelah setiap baris dalam file?