一、實踐證明,在AIX上用的是ksh,linux上是bash
sh或bsh,全名是bourne shell。它最早出現,是標准shell。后兩者都兼容它。
ksh和bash后續加入了歷史記錄,交互特性,數組,等新功能。
ksh在unix上使用較多。比如hpux,AIX
bash在linux上使用較多。
也可以用這些做命令跳到另一個shell,看個人習慣用哪個:
jimmy-cao@jimmycao-ThinkPad-Edge:~$ sh
$ bash
jimmy-cao@jimmycao-ThinkPad-Edge:~$ ksh
$
bash可以使用tab鍵補全,ksh貌似不能
二、使用上的具體區別,轉的
(1) 在ksh是,數組的index只能從0到1023,而bash中沒有這樣的限制。
(2) ksh與bash初始化數組的語法不同:
如下所示
icymoon# ksh
icymoon# set -A array 1 2 3 4 5; echo ${array[3]};
4
icymoon# bash
icymoon# array=(1 2 3 4 5); echo ${array[3]};
4
icymoon# array=([0]=1 [3]=2 [2]=3); echo ${array[3]}
2
(2) ksh與bash初始化數組的語法不同:
如下所示
icymoon# ksh
icymoon# set -A array 1 2 3 4 5; echo ${array[3]};
4
icymoon# bash
icymoon# array=(1 2 3 4 5); echo ${array[3]};
4
icymoon# array=([0]=1 [3]=2 [2]=3); echo ${array[3]}
2
1. 內置read命令
read VARIABLE?\ "xxxxxxxxxxxxxx"
2. 反義循環
until [[ ... ]] #這里的[[ ]]是ksh的括號,比sh的[]括號,[[]]能夠支持更多,更強大的命令行選項
do
xxxxxxx
done
2. 字符串的操作
我們有basename取出文件名,但是如果需要得到目錄名呢?
FULLPATH=`pwd`/$0
DIR=${FULLPATH%${FILENAME}}#從變量FULLPATH的最后開始,搜索第一個FILENAME的匹配,並刪除
%% 后面 最后一個
# 前面 第一個
## 后面 最后一個
DIR=${DIR%\/} #去掉反斜杠
basename=$(filename%%.cpp) #去掉文件名的.cpp后綴
3. 布爾操作
sh的布爾操作是-a -o,ksh可以 if [[ test1 && test2 ]]就像C語言的邏輯操作一樣
4. 把一個字符串拆成一個數組,元素之間是以空格或tab分隔
set -A Array $input
if [[ -z ${Array[0]} ]]echo"空的數組"
取數組下標和C語言類似,當然必須用${}包含
5. for數據(sh兼容)
for file in $inputfiles
do
cat $file|tr '[A-Z]' '[a-z]'|sed -e '/^$/d' -e '/^#/d'
#所有字符變成小寫,並刪除空行和注釋行('#'開頭)
done
6. 尋找新的文件 NEWER=`find $CLASSFILE -newer $JAVAFILE`
7. 直接數學計算
$ let x=0
$ let x=x+2
不需要使用expr反復計算
read VARIABLE?\ "xxxxxxxxxxxxxx"
2. 反義循環
until [[ ... ]] #這里的[[ ]]是ksh的括號,比sh的[]括號,[[]]能夠支持更多,更強大的命令行選項
do
xxxxxxx
done
2. 字符串的操作
我們有basename取出文件名,但是如果需要得到目錄名呢?
FULLPATH=`pwd`/$0
DIR=${FULLPATH%${FILENAME}}#從變量FULLPATH的最后開始,搜索第一個FILENAME的匹配,並刪除
%% 后面 最后一個
# 前面 第一個
## 后面 最后一個
DIR=${DIR%\/} #去掉反斜杠
basename=$(filename%%.cpp) #去掉文件名的.cpp后綴
3. 布爾操作
sh的布爾操作是-a -o,ksh可以 if [[ test1 && test2 ]]就像C語言的邏輯操作一樣
4. 把一個字符串拆成一個數組,元素之間是以空格或tab分隔
set -A Array $input
if [[ -z ${Array[0]} ]]echo"空的數組"
取數組下標和C語言類似,當然必須用${}包含
5. for數據(sh兼容)
for file in $inputfiles
do
cat $file|tr '[A-Z]' '[a-z]'|sed -e '/^$/d' -e '/^#/d'
#所有字符變成小寫,並刪除空行和注釋行('#'開頭)
done
6. 尋找新的文件 NEWER=`find $CLASSFILE -newer $JAVAFILE`
7. 直接數學計算
$ let x=0
$ let x=x+2
不需要使用expr反復計算