Bagaimana cara mengatur sebuah variabel output dari perintah di Bash?

Saya punya script sederhana itu adalah sesuatu seperti berikut:

#!/bin/bash

VAR1="$1"
MOREF='sudo run command against $VAR1 | grep name | cut -c7-'

echo $MOREF

Ketika saya menjalankan script ini dari baris perintah dan lulus argumen, saya tidak mendapatkan output. Namun, ketika saya menjalankan perintah-perintah yang terkandung dalam $MOREF variabel, saya mampu untuk mendapatkan output.

Bagaimana seseorang bisa mengambil hasil dari perintah yang harus dijalankan dalam script, simpan ke sebuah variabel, dan kemudian output yang variabel pada layar?

Mengomentari pertanyaan (4)
Larutan

Selain backticks `command` anda dapat menggunakan $(perintah) atau "$(perintah)" yang saya menemukan lebih mudah untuk membaca, dan memungkinkan untuk bersarang.

OUTPUT="$(ls -1)"
echo "${OUTPUT}"

MULTILINE=$(ls \
   -1)
echo "${MULTILINE}"

Mengutip (") tidak peduli untuk melestarikan multi-line-nilai.

Komentar (14)

Cara yang tepat adalah

$(sudo run command)

Jika anda're akan menggunakan apostrof, anda perlu `, bukan '. Karakter ini disebut "backticks" (atau "makam aksen").

Seperti ini:

#!/bin/bash

VAR1="$1"
VAR2="$2"

MOREF=`sudo run command against "$VAR1" | grep name | cut -c7-`

echo "$MOREF"
Komentar (4)

Karena mereka telah menunjukkan kepada anda, anda harus menggunakan 'backticks'.

Alternatif yang diusulkan $(perintah) bekerja dengan baik, dan juga lebih mudah untuk dibaca, tetapi perhatikan bahwa ini hanya berlaku dengan Bash atau KornShell (dan kerang yang berasal dari orang-orang), jadi jika script anda harus benar-benar portabel pada berbagai sistem Unix, anda harus lebih tua backticks notasi.

Komentar (7)

Beberapa [tag:bash] trik-trik yang saya gunakan untuk mengatur variabel-variabel dari perintah

2nd Edit 2018-02-12: Menambahkan cara yang berbeda, pencarian di bawah ini untuk lama-menjalankan tugas-tugas!

2018-01-25 Edit: tambahkan contoh fungsi (untuk mengisi vars tentang penggunaan disk)

Pertama lama yang sederhana dan cara yang kompatibel

myPi=`echo '4*a(1)' | bc -l`
echo $myPi 
3.14159265358979323844

Sebagian besar kompatibel, cara kedua

Seperti yang bersarang bisa menjadi berat, kurung dilaksanakan selama ini


myPi=$(bc -l 
Komentar (3)

Saya tahu tiga cara untuk melakukan:

1) Fungsi cocok untuk tugas-tugas seperti:

func (){
ls -l
}

Memohon dengan mengatakan func

2) Juga cocok bisa menjadi solusi eval:

var="ls -l"
eval $var

3) Yang ketiga adalah dengan menggunakan variabel-variabel yang secara langsung:

var=$(ls -l)
OR
var=`ls -l`

anda bisa mendapatkan output dari ketiga solusi dengan cara yang baik:

echo "$var"

dan juga dalam cara jahat:

echo $var
Komentar (3)

Hanya untuk menjadi berbeda:

MOREF=$(sudo run command against $VAR1 | grep name | cut -c7-)
Komentar (0)

Ketika pengaturan variabel pastikan anda memiliki TANPA Spasi sebelum dan/atau setelah = tanda. Benar-benar menghabiskan waktu satu jam mencoba untuk mencari ini, mencoba segala macam solusi! Ini Tidak keren.

Yang benar:

WTFF=`echo "stuff"`
echo "Example: $WTFF"

Akan Gagal dengan kesalahan: (hal-hal: tidak ditemukan atau serupa)

WTFF= `echo "stuff"`
echo "Example: $WTFF"
Komentar (1)

Jika anda ingin melakukannya dengan multiline/beberapa perintah/s maka anda dapat melakukan ini:


output=$( bash 
Komentar (16)

Anda perlu menggunakan salah

$(perintah berikut)

atau

`command-here`

contoh

#!/bin/bash

VAR1="$1"
VAR2="$2"

MOREF="$(sudo run command against "$VAR1" | grep name | cut -c7-)"

echo "$MOREF"
Komentar (2)

Anda dapat menggunakan kembali-kutu(juga dikenal sebagai aksen kuburan) atau $(). Seperti-

OUTPUT=$(x+2);
OUTPUT=`x+2`;

Keduanya memiliki efek yang sama. Tapi OUTPUT=$(x+2) lebih mudah dibaca dan yang terbaru.

Komentar (2)

Ini adalah cara lain, baik untuk digunakan dengan beberapa teks editor yang tidak benar menyoroti setiap rumit kode yang anda buat.


read -r -d '' str < 
Komentar (2)

Beberapa mungkin menemukan ini berguna. Nilai-nilai Integer ke dalam variabel substitusi, dimana trik ini adalah menggunakan $(()) kurung ganda:

N=3
M=3
COUNT=$N-1
ARR[0]=3
ARR[1]=2
ARR[2]=4
ARR[3]=1

while (( COUNT < ${#ARR[@]} ))
do
  ARR[$COUNT]=$((ARR[COUNT]*M))
  (( COUNT=$COUNT+$N ))
done
Komentar (5)

Berikut ini adalah dua cara:

Harap diingat bahwa ruang merupakan hal yang sangat penting dalam [tag:bash]. Jadi, jika anda ingin perintah anda untuk berjalan, gunakan seperti tanpa memperkenalkan lebih banyak ruang.

  1. berikut memberikan harshil untuk L dan kemudian cetakan itu

L=$"harshil" echo "$L"

  1. berikut menetapkan output dari perintah tr untuk L2. tr sedang dioperasikan pada variabel lain L1.

L2=$(echo "$L1" | tr [:upper:] [:lower:])

Komentar (2)

Jika perintah yang anda mencoba untuk mengeksekusi gagal, itu akan menulis output ke kesalahan stream dan kemudian akan dicetak ke konsol. Untuk menghindari hal itu, anda harus mengarahkan kesalahan stream

result=$(ls -l something_that_does_not_exist 2>&1)
Komentar (0)