- 46
- 0
- 0
- 21
کارشناس فناوری اطلاعات -
Linux Systems Administrator
در توسینسو تدریس کنید
و
با دانش خود درآمد کسب کنید
سلام و وقت بخیر. هنگامی که قرار است برای یک ورودی مقادیر مختلفی چک شود و به ازای هر مقدار آن تصمیم خاصی گرفته شود، از case استفاده میکنیم. case یک if توسعه یافته است. منطق case در زبان های برنامه نویسی مختلف یکسان است. به ساختار زیر دقت کنید.
یک مثال نسبتا ساده را از case در bash بررسی میکنیم. به کد زیر دقت کنید.
#!/bin/bash if [[ ! -d $1 ]] then echo "Usage: $0 <directory>" exit 1 fi case $2 in "directory") find $1 -maxdepth 1 -type d ;; "link") find $1 -maxdepth 1 -type l ;; *) echo "Usage: $0 <directory> directory | link " ;; esac exit 0
صورت مساله این است که برنامه ای بنویسید که یک مسیر بگیرد، سپس بر اساس اعلام کاربر به دنبال پوشه ها و یا لینک ها در این مسیر تا عمق یکی باشد.
اول از همه با دستور if بررسی میکند که آیا آرگومان اول ارسالی یک مسیر هست یا نه. علامت ! ینی نقیض. پس خط اول میشه اگه آرگومان اول یک directory نیست یک پیام چاپ کن و با کد خطا از برنامه خارج شو. اگر آرگومان اول یک مسیر باشد، شرط برقرار نمیشود و وارد بدنه دستور if نمیشود و برنامه ادامه میابد. بعد از آن از ساختار case برای تشخیص آرگومان ارسالی دوم استفاده کردیم. این case تصمیم میگیرد که با توجه به مقدار آرگومان دوم، چه دستوراتی اجرا شود. در حالت اول اگر مقدار آرگومان دوم directory باشد قطعه کئ زیر آن اجرا میشود. در حالت دوم هم اگر مقدار آرگومان دوم link باشد قطعه کد زیر آن اجرا میشود. مورد آخر که با ستاره مشخص شده یعنی حالت پیش فرض است اگر هیچ یک از سرایط بالا برقرار نباشد، قطعه کد درون ستاره اجرا میشود.
خروجی بصورت زیر است، حالت هایی که خطا میدهد را هم امتحان کردیم.
[mohammad@CentOS6 ~]$ case.sh Usage: /home/mohammad/bin/case.sh <directory> [mohammad@CentOS6 ~]$ case.sh /etc Usage: /home/mohammad/bin/case.sh <directory> directory | link [mohammad@CentOS6 ~]$ case.sh /etc link /etc/grub.conf /etc/rc1.d /etc/redhat-release /etc/favicon.png /etc/rc6.d /etc/rc2.d /etc/init.d /etc/rc.local /etc/rc4.d /etc/rc5.d /etc/rc /etc/rc3.d /etc/system-release /etc/rc0.d /etc/rc.sysinit [mohammad@CentOS6 ~]$ case.sh /etc directory /etc /etc/rpm /etc/iproute2 /etc/iscsi /etc/xml /etc/sound /etc/profile.d /etc/festival /etc/ssh /etc/ld.so.conf.d /etc/setuptool.d /etc/reader.conf.d /etc/request-key.d /etc/cups /etc/rsyslog.d /etc/chkconfig.d /etc/alternatives /etc/event.d /etc/spice /etc/cron.weekly /etc/libvirt /etc/popt.d /etc/skel /etc/bluetooth /etc/pcmcia /etc/logrotate.d /etc/NetworkManager /etc/ntp /etc/pulse /etc/cron.monthly /etc/dhcp /etc/samba /etc/default /etc/gnupg /etc/rpmdevtools /etc/selinux /etc/PackageKit /etc/vmware-tools /etc/makedev.d /etc/named /etc/fcoe /etc/sasl2 /etc/sudoers.d /etc/udev /etc/security /etc/prelink.conf.d /etc/bash_completion.d /etc/ssl /etc/modprobe.d /etc/hal /etc/sysconfig /etc/blkid /etc/X11 /etc/acpi /etc/rwtab.d /etc/opt /etc/pm /etc/xdg /etc/pam.d /etc/libreport /etc/gtk-2.0 /etc/sgml /etc/yum /etc/init /etc/postfix /etc/statetab.d /etc/ghostscript /etc/gnome-vfs-2.0 /etc/ConsoleKit /etc/dnsmasq.d /etc/foomatic /etc/plymouth /etc/scl /etc/gcrypt /etc/rc.d /etc/dracut.conf.d /etc/yum.repos.d /etc/httpd /etc/pango /etc/audit /etc/dbus-1 /etc/portreserve /etc/pki /etc/polkit-1 /etc/gdm /etc/xinetd.d /etc/cron.d /etc/cron.daily /etc/avahi /etc/audisp /etc/terminfo /etc/bonobo-activation /etc/gconf /etc/cron.hourly /etc/obex-data-server /etc/fonts /etc/vmware-caf /etc/lvm /etc/depmod.d /etc/wpa_supplicant /etc/ppp /etc/kdump-adv-conf /etc/openldap /etc/alsa /etc/lsb-release.d /etc/multipath [mohammad@CentOS6 ~]$
بسیار خوب. این یک مثال برای درک مطلب بود. سعی کنید کمی خلاقیت به خرج بدین و مثال بسازید. مثلا case رو با دستور read ترکیب کنید که case بر اساس متغیر هایی که بوسیله دستور read از کاربر گرفته میشود، تصمیم گیری کند.
پایان قسمت چهارم از بخش دوم
نویسنده : سید محمد باقر موسوی
منبع : جزیره لینوکس و سیستم های متن باز وب سایت توسینسو
هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی است