Variabel dari pernyataan bersyarat

Saya memiliki beberapa skrip yang saya ambil kepemilikannya menggunakan Bash shell, ada pernyataan find di dalam pernyataan kondisional.

Sesuatu seperti ini:

if [ -z $(find / -type f -perm -002) ] ; then echo "no world writable found"

sedangkan yang lain saya ingin menampilkan apa yang ditemukan alih-alih world write perms found.

Dapat saya lakukan:

echo $(find / -type f -perm -002) has world write permissions

atau setel variabel ke $(find / -type f -perm -002).

Namun bertanya-tanya apakah ada cara yang lebih baik untuk melakukan ini. Apakah ada cara lain untuk mengambil isi pernyataan find sebagai variabel?


person d3051    schedule 17.10.2014    source sumber
comment
Apa yang salah dengan menugaskan hasil penemuan ke suatu variabel?   -  person ceving    schedule 17.10.2014
comment
result=$(find / -type f -perm -002) atau local result=$(find / -type f -perm -002) jika terdapat dalam suatu fungsi akan menjadi cara idiomatis.   -  person helpermethod    schedule 17.10.2014
comment
Perhatikan bahwa dalam bahasa aslinya, Anda perlu mengutip perintah substitusi, karena jika diperluas menjadi lebih dari satu kata, [ akan mengeluh tentang terlalu banyak operan.   -  person chepner    schedule 17.10.2014
comment
Seringkali ini merupakan daftar yang panjang. Manajemen telah menekankan perubahan minimal sebagai preferensi. Jadi hanya menjajaki kemungkinan ada beberapa regex gila yang tidak saya kenal yang akan menggunakan apa yang ada untuk menyajikan konten dalam perintah find tanpa membuatnya dijalankan lagi.   -  person d3051    schedule 17.10.2014


Jawaban (3)


Anda tinggal mengambil outputnya dan menyimpannya dalam sebuah variabel. Jika belum kosong anda bisa mencetak isinya. Dengan cara ini Anda hanya perlu menjalankan perintah satu kali.

RESULT=$(find / -type f -perm -002)
if [ -z "$RESULT" ]
then
    echo "no world writable found"
else
    echo "$RESULT has world write permissions"
fi
person Chris Maes    schedule 17.10.2014
comment
Setelah melihatnya, sepertinya ini cara yang paling elegan. Saya akan menolak Mgmt dalam hal ini. Terima kasih! - person d3051; 17.10.2014

Anda dapat menggunakan sed untuk menyisipkan judul, jika Anda mau.

REPORT=$(find /tmp -type f -perm -002 | sed '1s/^/Found world write permissions:\n/')
echo ${REPORT:-No world writable found.}

Perhatikan: contoh Anda sepertinya rusak, karena find dapat mengembalikan lebih dari satu baris.

Dan awk dapat melakukan keduanya sekaligus:

find /tmp -type f -perm -002 | 
awk -- '1{print "Found world write permissions:";print};END{if(NR==0)print "No world writable found."}'
person ceving    schedule 17.10.2014
comment
Ini pintar. Saya belajar sesuatu di sini. Terimakasih atas tanggapan Anda! - person d3051; 17.10.2014

Jika Anda tidak keberatan tidak menerima pesan no world writable found, Anda dapat menggunakan satu pernyataan find, dan itu saja:

find / -type f -perm -002 -printf '%p has world write permissions\n'

Jika Anda perlu menyimpan file yang dikembalikan untuk digunakan di masa mendatang, simpanlah dalam array (dengan asumsi Bash):

#!/bin/bash

files=()

while IFS= read -r -d '' f; do
    files+=( "$f" )
    # You may also print the message:
    printf '%s has world write permissions\n' "$f"
done < <(find / -type f -perm -002 -print0)

# At this point, you have all the found files
# You may print a message if no files were found:

if ((${#files[@]}==0)); then
    printf 'No world writable files found\n'
    exit 0
fi

# Here you can do some processing with the files found...
person gniourf_gniourf    schedule 17.10.2014
comment
Akankah kemarahan para downvoter menjelaskan tindakannya? - person gniourf_gniourf; 23.10.2014