Perintah Shell untuk menghapus pengguna jaringan lama di Mac OS X Server

0

Saya mencoba menghapus akun pengguna jaringan lama dari server lab kami (Mac OS X 10.6). Saya menemukan perintah baris perintah sederhana untuk menemukan direktori pengguna yang belum diakses selama lebih dari setahun:

find /Volumes/Server-HD2/NetworkUsers/Students -type d -maxdepth 1 -mindepth 1 -not -name "." -mtime +356

Menjalankan perintah ini berhasil mendaftar semua akun lama. Saya kemudian menemukan apa yang tampak seperti loop sederhana, tetapi tidak berhasil:

#!/bin/bash

keep1="/Volumes/Server-HD2/NetworkUsers/Students/studenttest"
keep2="/Volumes/Server-HD2/NetworkUsers/Students/studenttest2"

USERLIST='find /Volumes/Server-HD2/NetworkUsers/Students -type d -maxdepth 1 -mindepth 1 -not -name "." -mtime +356'

for a in $USERLIST ; do
  [[ "$a" == "$keep1" ]] && continue                    #skip account 1
  [[ "$a" == "$keep2" ]] && continue                    #skip account 2
  echo "Deleting account and home directory for" $a
  dscl . delete $a                                      #delete the account
  rm -r $a                                              #delete the home directory
done

Ketika saya menjalankan perintah ini sebagai file shell yang dapat dieksekusi atau hanya langsung di baris perintah, itu memotong $ a sebagai setiap kata dalam $ USERLIST. Dalam karya lain jika saya hanya melakukan ini:

USERLIST='find /Volumes/Server-HD2/NetworkUsers/Students -type d -maxdepth 1 -mindepth 1 -not -name "." -mtime +356'

for a in $USERLIST ; do 
   echo $a
done

Itu akan kembali:

find
/Volumes/Server-HD2/NetworkUsers/Students
-type
d
-maxdepth
1
-mindepth
1
...

sedangkan saya mengharapkannya untuk mengembalikan setiap direktori yang memenuhi perintah "find".

Saya perlu mencari cara untuk membuat array hasil dari perintah find untuk mengulang. Saya kira saya tidak mengerti bagaimana array dan string ditangani dalam bash. Adakah pikiran?

James Pierce
sumber

Jawaban:

0

Anda telah menyertakan findperintah Anda dalam USERLISTpenugasan dalam tanda kutip tunggal - yang akan menetapkan seluruh perintah sebagai string ke $USERLISTvariabel (sebelumnya semua ekspansi shell - itulah tujuan tanda kutip tunggal). Sebagai gantinya, untuk mendapatkan output perintah yang ditetapkan, Anda harus menyertakannya dalam backticks (`) atau dalam sebuah $(<command>)konstruksi, yaitu

USERLIST=`find /Volumes/Server-HD2/NetworkUsers/Students -type d -maxdepth 1 -mindepth 1 -not -name "." -mtime +356`

atau

USERLIST=$(find /Volumes/Server-HD2/NetworkUsers/Students -type d -maxdepth 1 -mindepth 1 -not -name "." -mtime +356)
kopischke
sumber
Terima kasih! Mungkin sumber asli dan backtick dan di suatu tempat diketik atau disalin sebagai kutipan tunggal (').
James Pierce
1
Backticks membingungkan dalam beberapa hal. Cukup gunakan $( )saja.
Gordon Davisson