GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menyimpan perintah dalam variabel dalam skrip Shell?

Gunakan eval:

x="ls | wc"
eval "$x"
y=$(eval "$x")
echo "$y"

Jangan jangan gunakan eval ! Ini memiliki risiko besar memperkenalkan eksekusi kode arbitrer.

BashFAQ-50 - Saya mencoba memasukkan perintah ke dalam variabel, tetapi kasus rumit selalu gagal.

Masukkan ke dalam array dan perluas semua kata dengan tanda kutip ganda "${arr[@]}" untuk tidak biarkan IFS pisahkan kata karena Pemisahan Kata.

cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')

dan lihat isi array di dalamnya. declare -p memungkinkan Anda melihat isi array di dalam dengan setiap parameter perintah dalam indeks terpisah. Jika salah satu argumen tersebut berisi spasi, mengutip di dalam sambil menambahkan ke larik akan mencegahnya terbelah karena Pemisahan Kata.

declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'

dan jalankan perintah sebagai

"${cmdArgs[@]}"
23:15:18

(atau) semuanya menggunakan bash berfungsi untuk menjalankan perintah,

cmd() {
   date '+%H:%M:%S'
}

dan panggil fungsi hanya sebagai

cmd

POSIX sh tidak memiliki array, jadi hal terdekat yang bisa Anda lakukan adalah membuat daftar elemen dalam parameter posisi. Ini adalah sh POSIX cara untuk menjalankan program email

# POSIX sh
# Usage: sendto subject address [address ...]
sendto() {
    subject=$1
    shift
    first=1
    for addr; do
        if [ "$first" = 1 ]; then set --; first=0; fi
        set -- "[email protected]" --recipient="$addr"
    done
    if [ "$first" = 1 ]; then
        echo "usage: sendto subject address [address ...]"
        return 1
    fi
    MailTool --subject="$subject" "[email protected]"
}

Perhatikan bahwa pendekatan ini hanya dapat menangani perintah sederhana tanpa pengalihan. Itu tidak dapat menangani pengalihan, saluran pipa, loop for/while, pernyataan if, dll

Kasus penggunaan umum lainnya adalah saat menjalankan curl dengan beberapa bidang tajuk dan muatan. Anda selalu dapat mendefinisikan argumen seperti di bawah ini dan mengaktifkan curl pada konten array yang diperluas

curlArgs=('-H' "keyheader: value" '-H' "2ndkeyheader: 2ndvalue")
curl "${curlArgs[@]}"

Contoh lain,

payload='{}'
hostURL='http://google.com'
authToken='someToken'
authHeader='Authorization:Bearer "'"$authToken"'"'

sekarang setelah variabel ditentukan, gunakan larik untuk menyimpan perintah Anda args

curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")

dan sekarang lakukan perluasan kutipan yang tepat

curl "${curlCMD[@]}"

var=$(echo "asdf")
echo $var
# => asdf

Dengan menggunakan metode ini, perintah segera dievaluasi dan nilai pengembaliannya disimpan.

stored_date=$(date)
echo $stored_date
# => Thu Jan 15 10:57:16 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 10:57:16 EST 2015

Sama dengan backtick

stored_date=`date`
echo $stored_date
# => Thu Jan 15 11:02:19 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 11:02:19 EST 2015

Menggunakan eval di $(...) tidak akan membuatnya dievaluasi nanti

stored_date=$(eval "date")
echo $stored_date
# => Thu Jan 15 11:05:30 EST 2015
# (wait a few seconds)
echo $stored_date
# => Thu Jan 15 11:05:30 EST 2015

Menggunakan eval, ini dievaluasi saat eval digunakan

stored_date="date" # < storing the command itself
echo $(eval "$stored_date")
# => Thu Jan 15 11:07:05 EST 2015
# (wait a few seconds)
echo $(eval "$stored_date")
# => Thu Jan 15 11:07:16 EST 2015
#                     ^^ Time changed

Dalam contoh di atas, jika Anda perlu menjalankan perintah dengan argumen, masukkan ke dalam string yang Anda simpan

stored_date="date -u"
# ...

Untuk skrip bash, ini jarang relevan, tetapi satu catatan terakhir. Hati-hati dengan eval . Evaluasi hanya string yang Anda kontrol, bukan string yang berasal dari pengguna yang tidak dipercaya atau dibuat dari masukan pengguna yang tidak dipercaya.

  • Terima kasih kepada @CharlesDuffy karena telah mengingatkan saya untuk mengutip perintah!

Linux
  1. Bagaimana Kami Menjalankan Perintah yang Disimpan Dalam Variabel?

  2. Bagaimana Cara Menetapkan Output Perintah Ke Variabel Shell?

  3. Menyimpan Output Perintah Dalam Variabel Shell?

  1. Bagaimana Cara Mendapatkan Alamat Ip Sendiri Dan Menyimpannya Ke Variabel Dalam Script Shell?

  2. Bagaimana Membuat File Sementara Di Shell Script?

  3. Bagaimana Mengenalinya Jika Output Dari Perintah Atau Skrip Shell Adalah Stdout Atau Stderr?

  1. Cara Menetapkan Output dari Perintah Linux ke Variabel

  2. Bagaimana cara menyimpan hasil dari perintah Shell yang dieksekusi dalam variabel dengan python?

  3. Bagaimana cara mengatur variabel lingkungan dalam GDB menggunakan perintah Shell?