一、常用環境變量
1、HOME變量
Linux系統中的每個用戶都有一個相關的稱作HOME的目錄。
2、PATH變量
包含一列用冒號定界的目錄的路徑名字,便于可執行程序的搜索。
3、PS1變量
PS1變量包含了shell提示符,$符號
4、LOGNAME變量
包含用戶的注冊名字
echo “${LOGNAME}”
5、SHLVL變量
該變量包含你當前工作的shell level
6、SHELL變量
環境變量存儲了用戶的缺省shell,即shell類型
7、env命令
可用來查看所有已移除的環境變量表和它們各自的值
二、常用內部變量
$#
——傳送給shell程序的位置參數的數量
$?
——最后命令的完成碼或者在shell程序內部執行的shell程序(返回值)
$0
——shell程序的名稱
$*
——調用shell程序時所傳送的全部參數的單字符串, “參數1”“參數2”…形式保存的參數
$n
——第n個參數
三、條件判斷命令
test n1 -參數 n2(或 –參數 表達式)
真返回0,假返回1。
參數:
-lt 小于
-le小于等于
-gt 大于
-ge 大于等于
-eq 等于
-ne 不等于
·test語句的等價形式[ 1 –lt 4 ]
可用中括號代替test,把表達式括起來實現判斷
注意表達式與中括號間有空格。
test 1 –lt 4 //判斷1<4
echo $? //結果為0
eg:若輸入的參數x 是正數,顯示 x number is positive
#!/bin/bash
if test $1 -gt 0
then
echo "$1 number is positive"
fi
四、文件測試的常用代碼
-f 存在且是普通文件
-d 存在且是目錄
-s 存在且字節數大于0
-r 存在且可讀
-w 存在且可寫
-x 存在且可執行
如:test -d “mydoc”
判斷mydoc是否是目錄
五、課后作業
- 編寫一個名為iffile程序,它執行時判斷/bin目錄下date文件是否存在?
#! /bin/bashfname=/bin/dateif (test –f “$fname”) thenecho “exist”fi
說明:
在shell程序中經常需要判斷所處理的文件是否存在。本程序采用if語句的簡單格式測試date文件,如果存在,則顯示相關信息,否則退出if語句。
2.編寫一個名為greet的問候程序,執行時能根據系統當前的時間向用戶輸出問候信息。設從半夜到中午為早晨,中午到下午六點為下午,下午六點到半夜為晚上。
#! /bin/sh -hour=`date|cut –c 10-11`if test “$hour” –ge 0 –a “$hour” –lt 12; thenecho “Good morning!”elif test “$hour” –ge 12 –a “$hour” –le 18; thenecho “Good afternoon!”elseecho “Good evening!”fi
說明:
第一個有效語句是將命令執行的結果賦給hour變量,所以用反向單引號。
用cut命令從date命令的輸出中切割出“小時”信息;這里-c 10-11選項表示只切割10到11列。
這個程序使用了if連用格式,也可以使用if完整格式的嵌套形式。
3.編寫一個名為ifuser的程序,它執行時帶用戶名作為命令行參數,判斷該用戶是否已經在系統中登錄,并給出相關信息。
#! /bin/sh -
if test $# -ne 1 then
echo "Incorrect number of arguments"echo "Usage: ifuser username"
elseuser=$1if who | grep –q $user ; thenecho $1 "user is logged on."exit 0elseecho $1 "user is not logged on."exit 1fi
fi
說明:
(1)由于who | grep $user不是表達式而是命令組合,所以不需要test語句測試;如果命令組合執行成功,即找到指定的用戶名則返回碼為0;否則為非0。
(2)在這個程序中使用了grep字符串搜索命令和“|”管道命令
(3)用grep 命令–q選項來禁止顯示搜索到的信息。
(4)還使用了exit命令,以終止shell程序的執行。exit 0表示程序終止后返回0值,而exit 1表示程序終止后返回非0的值。
4.編寫一個名為menu的程序,實現簡單的彈出式菜單功能,用戶能根據顯示的菜單項從鍵盤選擇執行對應的命令。
#! /bin/sh -
clear
echo " -----------------MENU------------------"
echo
echo " 1.Find files modified in last 24 hours"
echo " 2.The free disk space"
echo " 3.Space consumed by this user"
echo " 4.Exit"
echo
echo -n " Select:"
read choice
case $choice in
1)find $HOME -mtime -1 -print;;
2)df;;
3)du -s $HOME;;
4)exit;;
*)echo "Invalid option"esac
說明:
(1)本程序菜單的第一項是顯示/home目錄下,最近24小時內所有修改過的文件。命令中的-1參數是數字“1”,表示一天(24小時)。第二項是檢查磁盤空間。第三項是顯示/home目錄下文件的大小,命令中的-s選項是為了僅顯示總計。第四項是退出程序。
(2)為了使程序美觀,用echo –n實現輸入的選擇數字不換行。
(3)輸入的數字不在1-4范圍內時,顯示無效的選項信息。
5.編寫一個名為chname的程序,將當前目錄下所有的.txt文件更名為.doc文件。
#! /bin/sh -
for file in *.txt
doleftname=`basename $file .txt`mv $file $leftname.doc
done
說明:
(1)在Linux系統中不支持mv .txt .doc這樣的更名命令形式,如果需要將文件成批地更名最好編寫一個shell腳本文件。
(2)在for語句的參數列表中使用了“*”通配符。
(3(在程序中用到basename命令,該命令從隨后的文件名剝去指定的后綴。
6.編寫一個名為chuser的程序,執行中每隔5分鐘檢查指定的用戶是否登錄系統,用戶名從命令行輸入;如果指定的用戶已經登錄,則顯示相關信息。
#! /bin/sh –if test $# -ne 1thenecho “Usage: chuser username”elseuser=”$1”until who |grep “$user”dosleep 300doneecho “$user has logged on!”fi
說明:
(1)如果沒有從命令行輸入用戶名,則測試$# -ne 1
為“真”,顯示用法提示信息。
(2)程序中until語句的expression(循環條件)是who|grep “$user”命令執行的返回碼,如果沒有找到指定的用戶名,返回碼為非0(為“假”),則用sleep命令暫停執行程序5分鐘;找到后返回碼為0(為“真”),則終止循環并顯示該用戶已經登錄的信息。
(3)采用重定向到/dev/null空文件的目的是不顯示查找到的用戶其他信息。