Shell常見知識
一、用戶登陸進入系統后的系統環境變量
$HOME 使用者自己的目錄
$PATH 執行命令時所搜尋的目錄
$TZ 時區
$MAILCHECK 每隔多少秒檢查是否有新的信件
$PS1 在命令列時的提示號
$PS2 當命令尚未打完時,Shell 要求再輸入時的提示號
$MANPATH man 指令的搜尋路徑
二、特殊變量
$0 這個程序的執行名字
$n 這個程序的第n個參數值,n=1..9
$* 這個程序的所有參數
$# 這個程序的參數個數
$$ 這個程序的PID
$! 執行上一個指令的PID
$? 執行上一個指令的返回值
三、shell中的變元
* 任意字符串
? 一個任意字符
[abc] a, b, c三者中之一
[a-n] 從a到n的任一字符
四、幾個特殊字符表示
/b 退回
/c 打印一行時沒有換行符 這個我們經常會用到
/f 換頁
/r 回車
/t 制表
/v 垂直制表
// 反斜線本身
五、判斷文件的屬性
格式:-操作符 filename
-e 文件存在返回1, 否則返回0
-r 文件可讀返回1,否則返回0
-w 文件可寫返回1,否則返回0
-x 文件可執行返回1,否則返回0
-o 文件屬于用戶本人返回1, 否則返回0
-z 文件長度為0返回1, 否則返回0.
-f 文件為普通文件返回1, 否則返回0
-d 文件為目錄文件時返回1, 否則返回0
六、測試字符串
字符串1 = 字符串2 當兩個字串相等時為真
字符串1 != 字符串2 當兩個字串不等時為真
-n 字符串 當字符串的長度大于0時為真
-z 字符串 當字符串的長度為0時為真
字符串 當串字符串為非空時為真
七、測試兩個整數關系
數字1 -eq 數字2 兩數相等為真
數字1 -ne 數字2 兩數不等為真
數字1 -gt 數字2 數字1大于數字2為真
數字1 -ge 數字2 數字1大于等于數字2為真
數字1 -lt 數字2 數字1小于數字2為真
數字1 -le 數字2 數字1小于等于數字2為真
八、邏輯測試
-a 與
-o 或
! 非
shell中的特殊字符有
1、$ 美元符
2、/ 反斜杠
3、` 反引號
4、" 雙引號
5、,*,?,[,]
下面我一一舉列說明
一、$符號
1、echo $? 顯示的是上一條指令退出狀態
2、echo "$?" 效果同上
3、echo '$?' 顯示的是$?
4、echo /$? 顯示的是$?
5、echo "/$?" 顯示的是$?
大家可能已經看出 $符號在雙引號中具有特殊意義 雙引號對$符號不起作用而單引號可以將特殊字符的的特殊意義屏蔽掉,使其能顯示為字符本身,反斜杠也可以將特殊字符的特殊含義屏蔽掉,使特殊字符失去特殊含義。
二、/ 反斜杠
反斜杠的作用是將特殊符號字符的特殊含義屏蔽掉,使其還是原字符
A=1234
echo /$A 顯示為$A 如果不加/將顯示為1234
echo /` 顯示為`
echo /" 顯示為雙引號
echo // 顯示為/
三、` 反引號
反引號的功能是命令替換,將反引號中的字符串做為命令來執行,我們在用shell編程時經常用的到 將系統命令的執行結果賦給一個變量
A=`date`
echo $A 顯示的不是date而是當時的時間串
比如有一文件A的內容如下
ABCDEFG
1234456
abcdefg
B=`cat A|grep 234` #
檢索文件A中含有字符串234的行
echo $B 將顯示為1234456
echo "$B" 將顯示為什么?
echo "/$B" 將顯示為什么?讀者自己試試
四、"雙引號
在系統中有些特殊字符,為避免引用這些特殊字符 往往用雙引號或單引號將這些特殊字符引起來,使其不具有特殊含義。
但有一部分特殊字符在引號中還是具有特殊含義,用雙引號引起來是不起作用的。本文中所列的前四個特殊字符在雙引號中還是特殊字符。為了使其不具有特殊含義一是用單引號引進來二是用/反斜線使其失去作用。
比如我們想原樣輸出這些特殊字符
echo """
echo "$"
echo "/"
echo "`"
以上不是你所期望的結果,因為雙引號對它們不起作用,你只能這樣才能輸出這些特殊字符的原形
echo '"'
echo '$'
echo '/'
echo '`'
或
echo "/""
echo "/$"
echo "http://"
echo "/`"
將分別顯示為 " $ / `
五、其它特殊字符
大家注意到,除了前四個特殊字符外,我將其它的特殊字符都放在一塊,這是因為前四個特殊字符在雙引號中還是具有特殊含義,所以單獨拿出來講,除此以外的特殊字符如果你要輸出這些特殊字符的原形,你就可以用雙引號或單引號引起來使其失去特殊含義。
,*,?,[,]對shell有特殊含義 但你可以用雙引號引起來輸入這些原形
一、if
條件語句
格式:
if 條件表達式
then #當條件為真時執行以下語句
命令列表
else #為假時執行以下語句
命令列表
fi
if 語句也可以嵌套使用
if
條件表達式1
then
if 條件表達式2
then
命令列表
else
if 條件表達式3
then
命令列表
else
命令列表
fi
fi
else
命令列表
fi
你可以進行多層嵌套 一個if語句一定要跟一個fi 表示該層條件結束否則會造成語法錯誤結合前面講的 舉例如下:
這里先講一個條件語句中用到的命令test 表示測試test后面的條件是否為真
if test -f "$1"
then
lpr $1
else
if test -d "$1"
then
cd $1
lpr $1
else
echo "$1不是文件或目錄"
fi
fi
以上的例子還可以改成如下所示
if test -f "$1"
then
lpr $1
elif test -d "$1" #elif 同else if
then
(cd
$1;lpr $1)
else
echo "$1不是文件或目錄"
fi
以上的例子不知您是否看懂是什么意思嗎?
假如我們現在將這個例子保存為prfile
chmod +x prfile
執行剛才的程序
./prfile aaa
這個例子是檢查你的輸入的參數是否是一個文件 如果是就打印 如果是一個目錄 先轉目錄再打印 如果即不是文件也不是目錄給出提示
二、多重條件測試語句case
格式:
case 字串 in
模式) 命令列表;;
模式) 命令列表;;
....
esac
多重條件語句是以case
開始以esac結束 中間可以有多個條件列表 功能是測試字串和和里面的模式有沒有匹配的,有就執行里面的命令列表 模式也可以是*號 表示任意字串,每個模式里面的最后要心;;雙引號結束,否則會發生語法錯誤。
現舉例如下:
case $1 in
*.c)
cc $1
*.txt)
lpr $1
*)
echo "未知的類型"
esac
假如將以上內容保存在文件abc中
chmod +x abc
執行 ./abc a.c
將會對文件a.c進行編譯
執行 ./abc readme.txt 將會把文件通過打印機
假如我將以上內容改一下,你是否會知道它的執行結果?
case $1 in
*)
cc $1
*.txt)
lpr $1
*.c)
echo
"未知的類型"
esac
一. while 循環
while 命令格式
while 條件表
do
命令表
done
執行過程
Shell首先執行條件表,如果條件表的最后一條語句的退出狀態為零,則執行盾環體內的命令表,執行完后,再檢查條件表,如果退出狀態為零將繼續執行,如此循環往復直到條件表的最后一條語句的退出狀態非零.
退出狀態為零就是條件為真True.
舉例說明 假如shell文件的內容如下:
Sum=0
i=0
while true #true是系統的關鍵詞 表示真
do
i=`expr $i + 1`
Sum=`expr $Sum + $i`
if [ $i = "100" ]
then
break;
fi
done
echo $i $Sum
最后這個程序顯示的是
100 5050
這個程序的運算就是將1到100加起來
下面將這個程序再改動一下
Sum=0
i=0
while [ $i != "100" ]
do
i=`expr $i + 1`
Sum=`expr $Sum + $i`
done
echo $i $Sum
改動后的程序運算結果和上面是一樣 但程序比上面的要簡練
在這個循環中還可以以until做為測試條件
它正好與while測試的條件相反,也就是當條件為假時將繼續執行循環體內的語句,否則就退出循環體,下面還用這個例子.
Sum=0
i=0
until [ $i = "100" ]
do
i=`expr $i + 1`
Sum=`expr $Sum + $i`
done
echo $i $Sum
當i不等于100時循環 就是當條件為假時循環,否則就退出,而第一個例子是當i不等于100
時循環,也就是測試條件為真時循環.
二.for 循環
命令格式:
for 變量 in 名字列表
do
命令列表
done
這里的名字列表是一個由空格分隔的字符串列表,shell在執行for循環時每次依次從名字表中取出一個字符串賦給循環變量作為變量的值.
在寫for語句時,也可以省略in 名字列表部分,這表示用當前的位置參數來代替這時的名字列表.
面舉個例子,比如在你的電腦中有兩個目錄,一個是aa,一個是bb在這兩個目錄中有5個相同的文件,但其中一個目錄中的一個或多個文件剛剛修改過,現在我忘記剛才改的是那幾個文件
了,那么我靠已知的序碼查找。
程序如下:
for File in a1 a2 a3 a4 a5
do
diff aa/$File bb/$File
done
下面再舉一個不帶名字列表的例子
for
File
do
echo $Filw
done
文件內容保存在a.sh中 并可執行
我們在執行這個shell程序時命令行如下:
a.sh a1 a2 a3 a4 a5
執行結果如下:
a1
a2
a3
a4
a5
大家從這個例子中可以看到命令行的參數被逐一讀入一次
三.循環控制語句
break
命令不執行當前循環體內break下面的語句從當前循環退出.
continue
命令是程序在本循體內忽略下面的語句,從循環頭開始執行.
新聞熱點
疑難解答